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

时间:2019-11-07 05:57:43

标签: android android-recyclerview recycler-adapter

我已经附上了我的应用程序的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中的项目时为什么会发生这种情况。请引导我解决这个问题。

谢谢

3 个答案:

答案 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());
}
相关问题