簡體   English   中英

Android recyclerview 不能 select 單項

[英]Android recyclerview can't select single Item

我有小圖像列表,我想在單擊時將單個圖像變大,問題是當我單擊多個圖像時,我之前單擊的其他圖像不會返回到它們的小尺寸,它們仍然很大。你能幫我嗎?

提前致謝。

這是它的外觀

截屏

適配器

public class PdfAdapter extends RecyclerView.Adapter<PdfAdapter.PdfViewHolder> {
    private Context mContext;
    private List<PdfModel> pdfModels;
    private OnItemClickListener listener;

    public PdfAdapter(Context mContext, List<PdfModel> pdfModels, OnItemClickListener listener) {
        this.mContext = mContext;
        this.pdfModels = pdfModels;
        this.listener = listener;
    }

    @NonNull
    @Override
    public PdfViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.pdf_layout, parent, false);
        return new PdfViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull PdfViewHolder holder, int position) {
        CardView.LayoutParams bigParams = new CardView.LayoutParams(200, 240);
        CardView.LayoutParams smallParams = new CardView.LayoutParams(120, 153);
        PdfModel model = pdfModels.get(position);
        Glide.with(mContext).load(model.getImage()).into(holder.imageView);
        if (listener != null) {
            holder.itemView.setOnClickListener(v -> {
                listener.onItemClick(holder.getAdapterPosition());
                if (!model.isSelected()) {
                   // model.setSelected(true);
                    for (int i = 0; i < pdfModels.size(); i++) {
                        pdfModels.get(i).setSelected(true);
                    }
                }else {
                    model.setSelected(false);
                }
                notifyItemChanged(position);
            });
        }
        if (model.isSelected()) {
            holder.cardView.setForeground(new ColorDrawable(ContextCompat.getColor(mContext, R.color.transparentColor)));
            holder.imageView.setLayoutParams(bigParams);
        } else {
            holder.imageView.setLayoutParams(smallParams);
            holder.cardView.setForeground(new ColorDrawable(ContextCompat.getColor(mContext, R.color.foregroundColor)));
        }
    }

    @Override
    public int getItemCount() {
        return pdfModels == null ? 0 : pdfModels.size();
    }

    class PdfViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.page_img)
        ImageView imageView;
        @BindView(R.id.card_view)
        CardView cardView;

        public PdfViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}

Pdf型號 Class

public class PdfModel {
    private int image;
    private boolean isSelected;

    public PdfModel(int image, boolean isSelected) {
        this.image = image;
        this.isSelected = isSelected;
    }

    public PdfModel(int image) {
        this.image = image;
    }

    public int getImage() {
        return image;
    }

    public void setImage(int image) {
        this.image = image;
    }

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

分段

 private void setPages(){
        mList = new ArrayList<>();
        mList.add(new PdfModel(R.drawable.rectangle1,false));
        mList.add(new PdfModel(R.drawable.rectangle2,false));
        mList.add(new PdfModel(R.drawable.rectangle3,false));
        mList.add(new PdfModel(R.drawable.rectangle4,false));
        mList.add(new PdfModel(R.drawable.rectangle6,false));
        mList.add(new PdfModel(R.drawable.rectangle1,false));
        mList.add(new PdfModel(R.drawable.rectangle2,false));
        mList.add(new PdfModel(R.drawable.rectangle3,false));
        mList.add(new PdfModel(R.drawable.rectangle4,false));
        mList.add(new PdfModel(R.drawable.rectangle5,false));
        mList.add(new PdfModel(R.drawable.rectangle6,false));
        adapter = new PdfAdapter(getActivity(),mList,this);
        recyclerView.setHasFixedSize(true);
      recyclerView.setLayoutManager(newLinearLayoutManager(getActivity(),RecyclerView.HORIZONTAL,false));
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onItemClick(int position) {
       // mList.get(position).setSelected(true);
    }

我認為問題在於

notifyItemChanged(position);

在 onBindViewHolder 中,您只通知適配器應該變大的項目而不是應該變小的項目。 最簡單的解決方法是將此行替換為

notifyDataSetChanged();

這將刷新所有項目。 另一種解決方案是記住適配器中當前選定項目的 position 並為記住的 position 調用 notifyItemChanged。

使用 notifyDataSetChanged 的最簡單方法

 if (listener != null) {
        holder.itemView.setOnClickListener(v -> {

            listener.onItemClick(holder.getAdapterPosition());
  
            model.setSelected(!model.isSelected());
          
            notifyDataSetChanged();
        });
    }    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM