我已附上我的应用程序的2张图片,第一个是普通图片。但是,当我滚动recyclerView
时,数据已更改,请查看第二张图像。
这是我的MainActivity.java代码
public class MainActivity extends AppCompatActivity {
private final String android_versions[]={
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"14",
"15",
"16",
"17",
"18",
"19",
"20"
};
RecyclerView recyclerView;
ItemAdapter itemAdapter;
LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recylerview);
itemAdapter = new ItemAdapter(MainActivity.this,android_versions);
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(itemAdapter);
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);
}
}
这里是Recylerview适配器代码
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {
Context mcontext;
String[] data;
int counter = 1;
public ItemAdapter(Context mcontext, String[] data) {
this.mcontext = mcontext;
this.data = data;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mcontext).inflate(R.layout.itemview, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.textView.setText(data[position]);
if (counter == 1) {
holder.textView.setBackgroundColor(Color.RED);
counter = 2;
holder.textView.setText("1");
} else if (counter == 2) {
holder.textView.setBackgroundColor(Color.GREEN);
counter = 3;
holder.textView.setText("2");
} else if (counter == 3) {
holder.textView.setBackgroundColor(Color.BLUE);
counter = 1;
holder.textView.setText("3");
}
}
@Override
public int getItemCount() {
return data.length;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
为什么在recylerview
中滚动项目时会发生这种情况。请引导我解决这个问题。
谢谢
您不能使用counter
之类的变量来获取商品在RecyclerView中的位置。您必须使用onBindViewHolder()
方法中提供的具有一致行为的位置变量。
总之,您必须使用position
方法中的onBindViewHolder()
变量来决定视图的外观。
如果您想将第一种布局设为红色并添加文字1
等,可以在onBindViewHolder()
中使用类似的内容:
int modulus = position % 3;
switch (modulus){
case 0:
//handle logic for red
break;
case 1:
//handle logic for green
break;
default:
//handle logic for blue
}
在解决此问题之前,让我们尝试了解recycler-view的工作原理。
Recycler视图创建一个视图池并将数据绑定到那些视图。
现在,当您开始滚动而不是扩大新视图时,它会重用用户不可见的视图
现在在您的onBindViewHolder中,您将在上下滚动时更改计数器。因此,当您再次到达顶部时,计数器已经更改,并且在完成dataBinding之后,会出现一些新的变化]
所以而不是尝试这个
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.textView.setText(data[position]);
int type = Integer.parseInt(data[position]);
if (type%3 == 1) {
holder.textView.setBackgroundColor(Color.RED);
holder.textView.setText("1");
} else if (type%3 == 2) {
holder.textView.setBackgroundColor(Color.GREEN);
holder.textView.setText("2");
} else if (type%3 == 0) {
holder.textView.setBackgroundColor(Color.BLUE);
holder.textView.setText("3");
}
}
我想那之后会很好。
您必须像这样为列表创建模型类
public class AndroidVersions{
String version;
int color;
// create constructor and getter setter for both
}
现在创建使用该类的列表
ArrayList<AndroidVersions> android_versions = new ArrayList();
添加类似的值
android_versions.add(new AndroidVersions("0", Color.RED));
android_versions.add(new AndroidVersions("1", Color.GREEN));
android_versions.add(new AndroidVersions("2", Color.BLUE));
.
.
.
.
并在recyclerView
中传递此>
在recyclerView中这样写代码
holder.textView.setText(data[position]);
holder.textView.setBackgroundColor(list.get(position).getColor());
holder.textView.setText(list.get(position).getVersion());
}