java - 如何跟踪 Android 中 RecyclerView 中的选定项目?

标签 java android android-recyclerview

如何使用 RecyclerView 实现一致的项目选择?我明白了 RecyclerView 回收旧 View 的全部想法。我的问题是我有一个项目列表,每个项目上都有一个图标,当单击一个项目时,图标会改变颜色。我设法实现了所有这些,但我刚刚意识到,当我向下滚动列表时,其他项目的图标也发生了变化,当我滚动回到我点击的项目时,图标不再在“点击”中颜色”。

有谁知道如何跟踪所选项目?我一直看到名为 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();
    }

}

最佳答案

我知道这个问题已经得到解答,但有人可能会发现这个答案有用且更容易。

在回收 View 中有一个有用的方法是onViewRecycled

这可以帮助您摆脱压力状态。当某些元素不使用可绘制对象时,在回收器 View 中处理图像/可绘制对象时,预览回收器 View 的绘制图像将出现,并且看起来所有数据都是错误的,因为它发生在您选择的 View 中。

要以更简单的方式实现此目的,您可以使用此方法清除绘制的图像以重置其值。

例如,您将所选元素的背景标记为绿色,并且您的一些 View 包含图像(注意:只有一些您的元素),然后使用此方法像这样:

@Override
        public void onViewRecycled(MyViewHolder holder) {
            super.onViewRecycled(holder);

            // Set ImageView's Drawable as transperent
            holder.myImageView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));

            // Set background color as transperent
            holder.bgContainer.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));

        }

现在您可以管理一个 ArrayList 具有所选元素的 ID/位置的整数(在回收器 View 的项目上使用 onClick 方法)。

使用onBindViewHolder(MyViewHolder myViewHolder, int position)可以正常填充数据。对于设置背景,您可以简单地检查 id/position 是否在 ArrayList 中(如果 true,设置背景颜色为绿色 else 保留它就是这样。因为它将由 onViewRecylcer 方法管理,即使未选中也不会影响其他绿色背景的滚动项。

希望它能对某人有所帮助,并使带有选择的回收站 View 更容易一些。

关于java - 如何跟踪 Android 中 RecyclerView 中的选定项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428104/

相关文章:

java - 在应用程序启动时启动 servlet

android - 将数据发送到我的 RV 适配器时出现问题,我该如何解决?

android - 为什么我不能从 json Retrofit 中获取特殊字段?

java - 与 OnCreate() 一起使用的方法来更新 Activity ?

java - 计算素数(新手)

Java Arrays.sort 将结果重置为零

java - 如何解决 Android KeyStore 上的 "communication failure"?

android - 如何为媒体播放器制作锁屏通知

android - 在应用程序订阅中执行 android 的最低操作系统是什么?

java - Intent 中的 Action_Send_Multiple 不起作用