如何使用RecyclerView实现一致的项目选择?我完全了解RecyclerView回收旧视图和什么不是.我的问题是我有一个项目列表,每个项目上都有一个图标,当点击一个项目时,图标会改变颜色.我设法实现了所有这一切,但我刚刚意识到,当我向下滚动列表时,其他项目的图标也发生了变化,当我滚动回到我点击的项目时,图标不再出现在“点击”中颜色”.
有谁知道如何跟踪所选项目?我一直在看一些名为SparseBooleanArray的东西,但我不确定如何实现它.
这是我的适配器代码:
public class TableRVAdapter extends RecyclerView.Adapter<TableRVAdapter.TableHolder> { List<Tables> tableList; private SparseBooleanArray selectedItems; public TableRVAdapter(List<Tables> tableList) { this.tableList = tableList; selectedItems = new SparseBooleanArray(); // setHasStableIds(true); } class TableHolder extends RecyclerView.ViewHolder { TextView tableTV; CardView tableCV; View circle; View parentView; TableHolder(final View itemView) { super(itemView); tableTV = (TextView)itemView.findViewById(R.id.tableTV); tableCV = (CardView)itemView.findViewById(R.id.tableCV); circle = itemView.findViewById(R.id.statusCircle); itemView.setClickable(true); parentView = itemView; tableCV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { circle.setBackgroundResource(R.drawable.circle); } }); } /* @Override public void onClick(View view) { if (selectedItems.get(getAdapterPosition(),false)) { tableCV.setSelected(false); circle.setBackgroundResource(R.drawable.circle2); } else { selectedItems.put(getAdapterPosition(),true); tableCV.setSelected(true); circle.setBackgroundResource(R.drawable.circle); } }*/ } @Override public TableHolder onCreateViewHolder(ViewGroup parent,int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.table_item,parent,false); TableHolder tableHolder = new TableHolder(view); return tableHolder; } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } @Override public void onBindViewHolder(TableHolder holder,int position) { holder.tableTV.setText(tableList.get(position).getTableNumber()); } /** * Returns the total number of items in the data set hold by the adapter. * * @return The total number of items in this adapter. */ @Override public int getItemCount() { return tableList.size(); } }
解决方法
RecyclerView.adapter有两个重要的功能来覆盖:
onCreateViewHolder(parent,viewType) onBindVIewHolder(viewholder,position)
第一个函数用于扩充将在recyclelerview中使用的视图,第二个函数用于将您拥有的数据绑定到此视图,从而在视图上设置正确的视图状态.
recyclerview本身只会膨胀一定数量的视图,然后开始重新使用已经膨胀的视图(因此是recyclelerview).因此,您需要为onBindViewholder()中的每个项目设置正确的状态,并在该位置使用集合中的项目来设置正确的viewState.对于您的示例:根据对象中的布尔值更改图标的颜色,例如:isPressed