2016-03-16 12 views
5

Ich habe eine grundlegende App mit RecyclerView und CardView von Get Tutorials von Websites erstellt.Wie RecyclerView-Konzept auf Android funktioniert?

App funktionieren gut, und ich habe einige Verwirrung. (Ich meinen ganzen Code bin hier zeige)

Verwirrung ist, dass, wie Code Schritt für Schritt arbeitet. also bitte lösche mein Konzept darauf.

Grundstruktur meiner App:

1) I have create an row_data_layout xml file to bind on recycler_view. 
2) Created an Data class file(Here i defined my variable that i used in App) 
2) Created an Adapter file (here i want to clear how it goes work step by step first which class call and why ?). 
3) Bind Data to Recycler View on MainActivity file 

row_data_layout.xml Datei:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/CardView" 
    android:paddingBottom="16dp" 
    android:layout_marginBottom="16dp"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/txt_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:text="Large Text" 
      android:textAppearance="?android:attr/textAppearanceLarge" /> 
    </LinearLayout> 

</android.support.v7.widget.CardView> 

Datenklasse Datei:

public class Data { 
    public String Name; 

    Data(String Name) 
    { 
     this.Name=Name; 
    } 
} 

Data_Adapter Class-Datei:

public class Data_Adapter extends RecyclerView.Adapter<Data_Adapter.View_holder> { 
    List<Data> list = Collections.emptyList(); 
    Context context; 

    public Data_Adapter(List<Data> list, Context context) { 
     this.list = list; 
     this.context = context; 
    } 

    @Override 
    public Data_Adapter.View_holder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_data_layout,parent,false); 
     View_holder holder=new View_holder(v); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(Data_Adapter.View_holder holder, int position) { 
      holder.name.setText(list.get(position).Name); 
    } 

    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    public class View_holder extends RecyclerView.ViewHolder{ 
     CardView cv; 
     TextView name; 

     public View_holder(View itemView) { 
      super(itemView); 
      cv = (CardView) itemView.findViewById(R.id.CardView); 
      name = (TextView) itemView.findViewById(R.id.txt_name); 
     } 
    } 
} 

MainActivity Datei:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     List<Data> data = fill_data(); 
     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     Data_Adapter adapter = new Data_Adapter(data,getApplicationContext()); 
     recyclerView.setAdapter(adapter); 
     recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    } 

    public List<Data> fill_data() 
    { 
     List<Data> data = new ArrayList<>(); 
     data.add(new Data("Bred Pit")); 
     data.add(new Data("Leonardo")); 

     return data; 
    } 
} 
+0

Sie bitte Ihre Frage klären. – natario

+0

Ich möchte wissen, wie adpater Schritt für Schritt funktioniert –

Antwort

19

Sobald Sie ein grundlegendes Verständnis davon haben, wie ein RecyclerView.Adapter arbeitet, wäre es sinnvoll, ein tieferes Eintauchen in die documentation zu nehmen.

Was der Adapter tut, ist ein Pool von überhöhten Ansichten (das können so viele different Typen von ViewHolder sein, wie Sie möchten), dass es mit den von Ihnen gelieferten Daten gefüllt wird. Wenn der Adapter keine leere Sicht im Pool hat, erstellt er eine neue Sicht.

Wenn ein Blick auf die RecyclerView angebracht ist, wird es aus dem Pool entfernt, und wenn es (scrollt über Ansicht, bis zu einem gewissen Abstand) abgelöst wird, wird es zurück in den Pool der leeren Ansichten hinzugefügt - deshalb Es ist wichtig, dass Sie alles zurücksetzen, wenn Sie Ihre ViewHolder füllen.

Die onCreateViewHolder() Funktion ist, wo eine neue, leere Ansicht (umschlossen von einem RecyclerView.ViewHolder) erstellt und zum Pool hinzugefügt wird.

Die onBindViewHolder() Funktion bekommt eine Ansicht von leeren Pool und füllt diese Ansicht unter Verwendung der Daten Sie mit dem Adapter geliefert. \

Sie die onViewRecycled() Methode verwenden können, bestimmte Aktionen auszuführen, wie ein Image Bitmap Einstellung auf null (auf detach), um die Speichernutzung zu reduzieren.

Normalerweise überschreibe ich onAttachedToRecyclerView() nicht, aber wenn Sie etwas spezifisch tun müssen, wenn Ihr Adapter mit dem RecyclerView verbunden ist, würden Sie es hier tun.

+1

Dies ist eine hilfreiche Erklärung. Vielen Dank. Du hast mich zuerst mit dem Begriff "leer" abgewimmelt, aber ich denke, ich verstehe jetzt die Bedeutung. Wenn ich richtig verstehe, bedeutet "leer" ein generisches GUI-Objekt, z. Widget, das aus einer XML-Beschreibung erstellt wurde, aber keine unterscheidenden Daten enthält. Sortieren einer Laufzeitvorlage, wenn Sie den Ausdruck entschuldigen. – orodbhen

+0

Korrekt, leer ist eine aufgeblähte Ansicht (oder Ansichtshierarchie), die noch keine Daten enthält. Der Adapter speichert einen Pool dieser (verwendeten und/oder unbenutzten), den er recycelt - er bläst mehr nach Bedarf auf. – wblaschko

Verwandte Themen