2015-03-31 3 views
0

Я реализующая панель навигации, используя вид ресайклера, ссылаясь на код, указанный на сайте: http://www.android4devs.com/2015/01/how-to-make-material-design-sliding-tabs.htmlпотока программы для Recycler View

В MainActivity.java, следующие строки называются.

mAdapter = new MyAdapter(TITLES,ICONS,NAME,EMAIL,PROFILE); 

mRecyclerView.setAdapter(mAdapter); 

mLayoutManager = new LinearLayoutManager(this);   

mRecyclerView.setLayoutManager(mLayoutManager); 

Я хочу знать, какие функции вызывают в каком порядке в MyAdapter.java? Вот код для MyAdapter.java

import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private static final int TYPE_HEADER = 0; // Declaring Variable to Understand which View is being worked on 
    // IF the view under inflation and population is header or Item 
    private static final int TYPE_ITEM = 1; 

    private String mNavTitles[]; // String Array to store the passed titles Value from MainActivity.java 
    private int mIcons[];  // Int Array to store the passed icons resource value from MainActivity.java 

    private String name;  //String Resource for header View Name 
    private int profile;  //int Resource for header view profile picture 
    private String email;  //String Resource for header view email 


    MyAdapter(String Titles[], int Icons[], String Name, String Email, int Profile) { // MyAdapter Constructor with titles and icons parameter 
     // titles, icons, name, email, profile pic are passed from the main activity as we 
     mNavTitles = Titles;    //have seen earlier 
     mIcons = Icons; 
     name = Name; 
     email = Email; 
     profile = Profile;      //here we assign those passed values to the values we declared here 
     //in adapter 


    } 

    // Creating a ViewHolder which extends the RecyclerView View Holder 
    // ViewHolder are used to to store the inflated views in order to recycle them 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     int Holderid; 
     TextView textView; 
     ImageView imageView; 
     ImageView profile; 
     TextView Name; 
     TextView email; 


     public ViewHolder(View itemView, int ViewType) {     // Creating ViewHolder Constructor with View and viewType As a parameter 
      super(itemView); 


      // Here we set the appropriate view in accordance with the the view type as passed when the holder object is created 

      if (ViewType == TYPE_ITEM) { 
       textView = (TextView) itemView.findViewById(R.id.rowText); // Creating TextView object with the id of textView from item_row.xml 
       imageView = (ImageView) itemView.findViewById(R.id.rowIcon);// Creating ImageView object with the id of ImageView from item_row.xml 
       Holderid = 1;            // setting holder id as 1 as the object being populated are of type item row 
      } else { 
       Name = (TextView) itemView.findViewById(R.id.name);   // Creating Text View object from header.xml for name 
       email = (TextView) itemView.findViewById(R.id.email);  // Creating Text View object from header.xml for email 
       profile = (ImageView) itemView.findViewById(R.id.circleView);// Creating Image view object from header.xml for profile pic 
       Holderid = 0;            // Setting holder id = 0 as the object being populated are of type header view 
      } 
     } 


    } 

    //Below first we ovverride the method onCreateViewHolder which is called when the ViewHolder is 
    //Created, In this method we inflate the item_row.xml layout if the viewType is Type_ITEM or else we inflate header.xml 
    // if the viewType is TYPE_HEADER 
    // and pass it to the view holder 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     if (viewType == TYPE_ITEM) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false); //Inflating the layout 

      ViewHolder vhItem = new ViewHolder(v, viewType); //Creating ViewHolder and passing the object of type view 

      return vhItem; // Returning the created object 

      //inflate your layout and pass it to view holder 

     } else if (viewType == TYPE_HEADER) { 

      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false); //Inflating the layout 

      ViewHolder vhHeader = new ViewHolder(v, viewType); //Creating ViewHolder and passing the object of type view 

      return vhHeader; //returning the object created 


     } 
     return null; 

    } 

    //Next we override a method which is called when the item in a row is needed to be displayed, here the int position 
    // Tells us item at which position is being constructed to be displayed and the holder id of the holder object tell us 
    // which view type is being created 1 for item row 
    @Override 
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { 
     if (holder.Holderid == 1) {        // as the list view is going to be called after the header view so we decrement the 
      // position by 1 and pass it to the holder while setting the text and image 
      holder.textView.setText(mNavTitles[position - 1]); // Setting the Text with the array of our Titles 
      holder.imageView.setImageResource(mIcons[position - 1]);// Settimg the image with array of our icons 
     } else { 

      holder.profile.setImageResource(profile);   // Similarly we set the resources for header view 
      holder.Name.setText(name); 
      holder.email.setText(email); 
     } 
    } 

    // This method returns the number of items present in the list 
    @Override 
    public int getItemCount() { 
     return mNavTitles.length + 1; // the number of items in the list will be +1 the titles including the header view. 
    } 


    // With the following method we check what type of view is being passed 
    @Override 
    public int getItemViewType(int position) { 
     if (isPositionHeader(position)) 
      return TYPE_HEADER; 

     return TYPE_ITEM; 
    } 

    private boolean isPositionHeader(int position) { 
     return position == 0; 
    } 

} 

я понял, какие именно функции делать, прочитав комментарии, на я хочу знать, в каком порядке они называют? Может кто-нибудь помочь мне понять это? Спасибо.

ответ

3

Порядок, в котором вызываются методы внутри адаптера заключается в следующем:

  1. The RecyclerView попытки захватить держатель вида для определенной позиции из своего пула переработаны (или отбракованных) держатели просмотра.
  2. Когда он делает это, он вызывает getItemViewType для позиции, которую он хочет заполнить
  3. Затем он пытается захватить ранее созданный держатель вида, связанный с этим типом просмотра этого элемента.
  4. Если на изображении RecyclerView нет доступного держателя для этого типа товара, он вызывает onCreateViewHolder, чтобы создать новый держатель для этого типа.
  5. После того, как достигнут держатель вида (будь то путем создания нового или захвата утерянного/переработанного), он затем вызывает onBindViewHolder от адаптера, чтобы установить правильные данные для держателя вида.
  6. За все это время getItemCount будет использоваться, чтобы гарантировать, что RecyclerView не пытается заполнить держатель обзора за пределы источника данных.
+0

Почему класс ViewHolder должен быть вложен в класс MyAdapter? – digiVader

+0

где написано? Речь идет о предпочтении/требовании, но нет указаний, в которых говорится, что класс владельца представления должен быть вложен в класс адаптера, по крайней мере, об этом я не знаю. –