Rac*_*acu 1 android android-adapter gridlayoutmanager android-recyclerview
我需要有关多/单选择的帮助。在这里找到了我要找的东西,因为它很简单。我正在使用一个GridLayoutManager我的适配器中有超过 90 个项目,一个CardView带有 aTextView和 an ImageView,同时使用帖子中描述的过程。
当我选择一个或多个项目时,当我向下滚动时,其他项目“似乎”被选中,因为背景会复制,但它们未被选中。尝试将setOnClickListener, 放入onBindViewHolderMyViewHolder 类中,并且在它们两个类中我都得到相同的行为。向下滚动时,似乎选择了其他项目。使用notifyItemChanged(position)并notifyDataSetChanged()在适配器中,但背景根本没有改变,尽管setSelected工作正常。我setHasFixedSize(true)也在 RecyclerView 设置中使用。
在 onBindViewHolder
@Override
public void onBindViewHolder(MyViewHolder myViewHolder, final int position) {
PatternImages currentPattern = patternImages.get(position);
myViewHolder.setData(currentPattern, position);
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setSelected(!v.isSelected());
if (v.isSelected()) {
v.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimaryHighLight));
} else {
v.setBackgroundColor(Color.WHITE);
}
notifyItemChanged(position);
}
});
}
Run Code Online (Sandbox Code Playgroud)
模型
public class PatternImages {
private int imageId, imageName;
private boolean isSelected;
public PatternImages(int imageId, int imageName, boolean isSelected) {
this.imageId = imageId;
this.imageName = imageName;
this.isSelected = isSelected;
}
public int getImageId() {
return imageId;
}
public void setImageId(int imageId) {
this.imageId = imageId;
}
public int getImageName() {
return imageName;
}
public void setImageName(int imageName) {
this.imageName = imageName;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
Run Code Online (Sandbox Code Playgroud)
RecyclerView 设置
private void setUpPatternsRecyclerView() {
RecyclerView recyclerPatternsView = (RecyclerView) findViewById(R.id.pattern_image_recycler_view);
PatternImageAdapter adapter = new PatternImageAdapter(this, patternImages);
recyclerPatternsView.setAdapter(adapter);
ColumnQty columnQty = new ColumnQty(this, R.layout.item_image_pattern_cardview);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), columnQty.calculateNoOfColumns());
recyclerPatternsView.setHasFixedSize(true);
recyclerPatternsView.setLayoutManager(gridLayoutManager);
recyclerPatternsView.setItemAnimator(new DefaultItemAnimator());
recyclerPatternsView.addItemDecoration(new GridSpacing(columnQty.calculateSpacing()));
}
Run Code Online (Sandbox Code Playgroud)
setData 方法
public void setData(PatternImages currentPattern, int position) {
this.position = position;
patternName.setText(context.getString(currentPattern.getImageName()));
patternName.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/ElMessiri-SemiBold.ttf"));
patternImage.setBackgroundResource(currentPattern.getImageId());
if (position == 0 || position == 1) {
animationDrawable = (AnimationDrawable) patternImage.getBackground();
animationDrawable.start();
}
}
Run Code Online (Sandbox Code Playgroud)
ARecyclerView顾名思义,回收视图。这意味着一旦视图滚动到屏幕外,它就可以被重用。
在重用视图之前,它仍包含上次使用时的所有设置。例如,如果它包含TextView,TextView则仍会将其 Text 属性设置为上次显示时的任何内容。
某些项目“似乎”被选中的原因是因为您选择的滚动出屏幕的视图现在正在被重用,并且您没有取消选择它们。
在您的OnBindViewHolder方法中,您需要将所有视图“重置”回它们的默认值。在这种情况下,这将“关闭”您用来使视图显示为选中状态的任何方法。
例如:
@Override
public void onBindViewHolder(MyViewHolder myViewHolder, final int position) {
final PatternImages currentPattern = patternImages.get(position);
myViewHolder.setData(currentPattern, position);
myViewHolder.itemView.setBackgroundColor(currentPattern.isSelected() ?R.color.Red: R.color.WHITE); // choose your colors
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentPattern.setSelected(!currentPattern.isSelected())
notifyItemChanged(position);
}
});
}
Run Code Online (Sandbox Code Playgroud)
本质上,每次绑定时,您都会根据模型中的相关属性将背景颜色设置为选中或未选中状态。
| 归档时间: |
|
| 查看次数: |
6340 次 |
| 最近记录: |