recylerview上下滚动时,RecylerView滚动问题数据已更改

问题描述 投票:2回答:3

我已附上我的应用程序的2张图片,第一个是普通图片。但是,当我滚动recyclerView时,数据已更改,请查看第二张图像。

这里是正常情况enter image description here

我上下滚动后enter image description here

这是我的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中滚动项目时会发生这种情况。请引导我解决这个问题。

谢谢

android android-recyclerview recycler-adapter
3个回答
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
投票

在解决此问题之前,让我们尝试了解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");
    }
}

我想那之后会很好。


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());
}
© www.soinside.com 2019 - 2024. All rights reserved.