[英]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.