在RecyclerView中select项目

类似的问题已经被问到,但我不能得到他们的任何工作。

我想要的是在RecyclerView中select项目,更改该项目视图的背景,并存储所选项目的位置。

主要的问题是你有onCreateViewHolder(在适配器),onBindViewHolder(在适配器)和ViewHolder的构造函数,每个人都在使用不同的方法。 现在,我甚至不知道把ClickListener放在哪里(在以前的项目中我把它放在ViewHolder中),因为人们也在暗示其他两种方法。

我的想法是将每个ViewHolder(或视图)存储在列表中,所以我可以引用每一行,并从那里更改背景。 但是这并不适用于我,因为当我尝试从三个地方(onCreateVH,onBindVH,VH类)添加到视图(或ViewHolders)列表,我的应用程序崩溃的原因(空指针前)。

有什么build议么? 在哪里以及如何实施?

请参阅第1部分和第2部分。关于RecyclerView的很好的教程。 第2部分清楚地解释了如何实现RecyclerView与select项目,onclick和所有其他列表视图的东西。 源代码也在github上给出。 希望能帮助到你

http://www.bignerdranch.com/blog/recyclerview-part-2-choice-modes/

使全局variables存储位置并处理ViewHolder单击监听ViewHolder 。 项目Onclick ,改变全球的位置值

 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { globalPosition=getAdapterPosition(); notifyDataSetChanged(); } }); 

然后在onBindViewHolder

 if(postion==globalPosition) { //change color like textview.setTextColor(Color.RED); } else { //revert back to regular color textview.setTextColor(Color.WHITE); } 

用这个代码,你点击的项目变成红色,其他的变成白色。

首先,你问了在哪里放置onClickListener – 你应该把它放在onBindViewHolder中。 您也可以在您的项目的ViewHolder类中附加onClickListener,如下所示:

 public class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } } 

至于实现单一的select行为,这里给出的答案工作,但调用onNotifyDatasetChanged性能不好,如果你有很多的项目,因为它重新绑定所有视图从头开始每次。

Rafiduzzaman Sonnet给出的链接是了解很多关于设置RecyclerView的很好的教程,但我认为这使单选行为变得复杂。 我将全面回答所有可能需要的工作。 以下是我如何实现单一select行为:

 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { final YourItemViewHolder itemViewHolder = (YourItemViewHolder) holder; //This will remember which one was selected itemViewHolder.getItemSelectionIndicator() .setSelected(position == mSelectedPosition); itemViewHolder.getItemWrapperView() .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(mLogTag, "Tapped on " + position); //This is the previous selection notifyItemChanged(mSelectedPosition); itemViewHolder.getItemSelectionIndicator().setSelected(true); mSelectedPosition = position; //This is the new selection notifyItemChanged(position); } }); 

getItemSelectionIndicator()getItemWrapperView()是项目的ViewHolder中的方法,从项目布局返回特定的视图。 ItemWrapperView可以是包装整个项目的最上面的Linear / RelativeLayout。 设置一个点击监听器将确保点击工作,如果用户点击项目的视图中的任何地方。

ItemSelectionIndicator可以是一个Linear或RelativeLayout,它已经设置了一个状态列表可绘制的背景。 这意味着当它被设置为选中时,它会自动显示一个可绘制的形状来指示select。 当它被设置为未选中时,绘图将被自动删除。 这是指标视图的样子:

 <RelativeLayout android:id="@+id/selection_indicator" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/selection_indicator_state_list"/> 

这是res / drawable中的selection_indicator_state_list.xml:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Selected background --> <item android:state_selected="true" android:drawable="@drawable/item_selection_shape"/> <!-- Unselected background --> <item android:state_selected="false" android:drawable="@color/transparent"/> </selector> 

这是res / drawable中的item_selection_shape.xml:

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> //22 is value of transparency, BDBDBD is the color <solid android:color="#22BDBDBD"/> <stroke android:width="2dp" android:color="@color/md_blue_600"/> <corners android:radius="3dp"/> </shape>