2017-07-14 36 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”中执行任何操作。所以或多或少你是对的。 –

相关问题