我已经附上了我的应用程序的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
中的项目时为什么会发生这种情况。请引导我解决这个问题。
谢谢
答案 0 :(得分:2)
您不能使用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
}
答案 1 :(得分:1)
在解决此问题之前,让我们先了解一下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");
}
}
我想那以后会很好的。
答案 2 :(得分:0)
您必须像这样为列表创建模型类
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());
}