代码之家  ›  专栏  ›  技术社区  ›  mixx

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

  •  0
  • mixx  · 技术社区  · 6 年前

    [1] 以下内容: https://imgur.com/a/PndmbHf

    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);
    
        }
    }
    }
    

    有人知道这是怎么回事吗?我只想通过这个方法实现卡片列表的多重选择。(我不确定将来是否会处理一些cardview,所以我希望使用uan recyclerview,而不是在.xml文件中创建单独的卡。

    按照leojg的建议更新了代码。将onClick事件管理移到onBindViewHolder。但问题依然存在。

    1 回复  |  直到 6 年前
        1
  •  0
  •   leojg    6 年前

    发生这种情况是因为“回收者”视图在项目离开屏幕时回收项目位置。

    你应该把onclick逻辑移到 onBindViewHolder()