繁体   English   中英

RecyclerView中的Cardview可以选择多张卡片,而不仅仅是一张

[英]Cardview in RecyclerView selects multi cards and not just one

我正在创建一个简单的android应用程序,其中创建cardview并通过recycleview插入。 我增加了选择每张卡片的可能性,这会更改文本的颜色并使它在卡片上可见。 问题是,当您单击第一张卡时,选择效果也会添加到最后一张卡上,就好像存在计数错误或其他错误一样。 实际上,第一张和最后一张卡已连接在一起,就好像它们是一样的,如下图所示:

[1]: https//imgur.com/a/PndmbHf

[2]: https//imgur.com/a/0epn5p8

我还没有发现任何此类问题,但过去我曾在与cardview的交互中处理过类似的问题。 这是我的适配器以及执行此操作的代码:

public class AllMovesListAdapter extends RecyclerView.Adapter<AllMovesListAdapter.UserViewHolder> {
private static CardView card;
private List<moveListActivity.move_card> moveList;
private static Context context;
int[] counter;

public AllMovesListAdapter(List<moveListActivity.move_card> biglList, Context context) {
    this.moveList = biglList;
    this.context = context;
}

@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.move_card, null);
    UserViewHolder userViewHolder = new UserViewHolder(view);
    counter = new int[getItemCount()];
    return userViewHolder;
}

@Override
public void onBindViewHolder(final UserViewHolder holder, int position) {
    moveListActivity.move_card mcard = moveList.get(position);
    holder.tvName.setText(mcard.getName());
    holder.tvDescr.setText(mcard.getDescr());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = holder.getAdapterPosition();
            if (position!=RecyclerView.NO_POSITION){
                if (counter[position]==0){
                    holder.ivTr.setVisibility(View.VISIBLE);
                    holder.tvName.setTextColor(ContextCompat.getColor(context, R.color.green));
                    holder.tvDescr.setTextColor(ContextCompat.getColor(context, R.color.green));
                    counter[position]=1;
                }else{
                    holder.ivTr.setVisibility(View.GONE);
                    holder.tvName.setTextColor(ContextCompat.getColor(context, R.color.white));
                    holder.tvDescr.setTextColor(ContextCompat.getColor(context, R.color.white));
                    counter[position]=0;
                }
                Snackbar.make(v, "Click detected on item " + position + "| counter: " + counter[position],
                        Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }

        }
    });
}

@Override
public int getItemCount() {
    return moveList.size();
}

public static class UserViewHolder extends RecyclerView.ViewHolder {
    ImageView ivMove, ivTr;
    TextView tvName;
    TextView tvDescr;

    public UserViewHolder(View itemView) {
        super(itemView);
        ivTr = (ImageView) itemView.findViewById(R.id.ivTr);
        ivMove = (ImageView) itemView.findViewById(R.id.ivMove);
        tvName = (TextView) itemView.findViewById(R.id.tvName);
        tvDescr = (TextView) itemView.findViewById(R.id.tvDescr);

    }
}
}

有人知道这个问题取决于什么吗? 我只是想通过此方法对卡列表进行多选。 (我不确定将来是否会处理一些卡片视图,因此我想使用uan recyclerview而不是在.xml文件中创建单个卡片。

编辑:按照leojg的建议更新了代码。 将onClick事件管理移至onBindViewHolder。 但是问题仍然存在。

发生这种情况是因为回收站视图在屏幕外时回收了项目位置。

您应该将onclick逻辑移至onBindViewHolder()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM