2017-07-14 38 views
0

我很困惑點擊處理如何在這裏工作。爲什麼我們從主要活動thisGreenAdapter構造函數和設置ListItemClickListener mOnClickListenerthis回收站點擊處理是什麼?

在RecyclerView中的點擊處理工作到底如何。

NumberViewHolder僅在此處創建或調用10次,並可在100個項目視圖的其餘部分中循環使用。那麼onClick(View v)如何區分100個不同的列表項視圖。我們只在創建的10個項目視圖上設置itemView.setOnClickListener。

public class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder> { 

    private static final String TAG = GreenAdapter.class.getSimpleName(); 


    final private ListItemClickListener mOnClickListener; 


    private static int viewHolderCount; 

    private int mNumberItems; 


    public interface ListItemClickListener { 
     void onListItemClick(int clickedItemIndex); 
    } 


    public GreenAdapter(int numberOfItems, ListItemClickListener listener) { 
     mNumberItems = numberOfItems; 
     mOnClickListener = listener; 
     viewHolderCount = 0; 
    } 


    @Override 
    public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
     Context context = viewGroup.getContext(); 
     int layoutIdForListItem = R.layout.number_list_item; 
     LayoutInflater inflater = LayoutInflater.from(context); 
     boolean shouldAttachToParentImmediately = false; 

     View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately); 
     NumberViewHolder viewHolder = new NumberViewHolder(view); 

     viewHolder.viewHolderIndex.setText("ViewHolder index: " + viewHolderCount); 

     int backgroundColorForViewHolder = ColorUtils 
       .getViewHolderBackgroundColorFromInstance(context, viewHolderCount); 
     viewHolder.itemView.setBackgroundColor(backgroundColorForViewHolder); 

     viewHolderCount++; 
     Log.d(TAG, "onCreateViewHolder: number of ViewHolders created: " 
       + viewHolderCount); 
     return viewHolder; 
    } 


    @Override 
    public void onBindViewHolder(NumberViewHolder holder, int position) { 
     Log.d(TAG, "#" + position); 
     holder.bind(position); 
    } 


    @Override 
    public int getItemCount() { 
     return mNumberItems; 
    } 


    class NumberViewHolder extends RecyclerView.ViewHolder 
     implements View.OnClickListener { 

     // Will display the position in the list, ie 0 through getItemCount() - 1 
     TextView listItemNumberView; 
     // Will display which ViewHolder is displaying this data 
     TextView viewHolderIndex; 


     public NumberViewHolder(View itemView) { 
      super(itemView); 

      listItemNumberView = (TextView) itemView.findViewById(R.id.tv_item_number); 
      viewHolderIndex = (TextView) itemView.findViewById(R.id.tv_view_holder_instance); 

      itemView.setOnClickListener(this); 
     } 


     void bind(int listIndex) { 
      listItemNumberView.setText(String.valueOf(listIndex)); 
     } 



     @Override 
     public void onClick(View v) { 
      int clickedPosition = getAdapterPosition(); 
      mOnClickListener.onListItemClick(clickedPosition); 
     } 
    } 
} 

在mainActivity,我有

public class MainActivity extends AppCompatActivity 
     implements GreenAdapter.ListItemClickListener { 
... 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     mNumbersList = (RecyclerView) findViewById(R.id.rv_numbers); 


     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     mNumbersList.setLayoutManager(layoutManager); 


     mNumbersList.setHasFixedSize(true); 


     mAdapter = new GreenAdapter(NUM_LIST_ITEMS, this); 
     mNumbersList.setAdapter(mAdapter); 
    } 
@Override 
    public void onListItemClick(int clickedItemIndex) { 

     if (mToast != null) { 
      mToast.cancel(); 
     } 


     String toastMessage = "Item #" + clickedItemIndex + " clicked."; 
     mToast = Toast.makeText(this, toastMessage, Toast.LENGTH_LONG); 

     mToast.show(); 
    } 
... 
} 
+2

這裏'this'關鍵字用來提實現的接口。實際上,它指的是一個MainActivity,它是一個ListItemClickListener。這是java的基礎知識。 –

+0

好的,謝謝。 NumberViewHolder僅在此處創建或調用10次,並可在其餘項目視圖中循環使用。那麼onClick(View v)如何區分100個不同的列表項視圖 – raxx

+0

爲什麼你要求我們解釋別人的代碼/你爲什麼不問問編寫它的人? –

回答

2

ViewHolder任務是保持你不同的觀點(在這種情況下100)可用。這對於設備性能來說是瘋狂的,所以RecyclerView'10'回收它們10(或其他)。 NumberViewHolder被稱爲這10個不同的元素中的每一個,所以當你點擊它時,系統知道哪個元素被引用。

這就是你爲此設置了itemView.setOnClickListener(this);的原因,因爲每個View必須有他自己的。

Android Developers Guide

RecyclerView.ViewHolder

甲ViewHolder介紹有關其位置的 RecyclerView內的項目視圖和元數據。

所以一切要爲您View設置已被定義在了那裏,然後RecyclerView會做它適用於所有項目的「髒活」。

編輯:這裏有一個類似的問題,我問比一年多前同樣的事情:Click an ImageButton which belongs to a CardView inside a RecyclerView

+0

好的,謝謝,我還有一個qn。當我調用super(itemView)時,RecyclerView.ViewHolder類的最終itemView變量正在初始化爲我們在超級調用中傳遞的itemView,對吧? – raxx

+0

由於您正在擴展另一個類的功能(在這種情況下爲'RecyclerView.ViewHolder'),因此您必須首先「執行」父類方法,然後才能在自定義的「ViewHolder」中執行任何操作。所以或多或少你是對的。 –

相關問題