【问题标题】:Why is my recyclerView redoing stuff in onBindViewHolder?为什么我的 recyclerView 在 onBindViewHolder 中重做东西?
【发布时间】:2020-11-24 22:50:27
【问题描述】:

我有一个recyclerView,在这个 recyclerView 中我有一个对象,它在我的布局中显示了几次。我想尝试改变确切位置的确切对象,如下所示:

@Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder0, int i) {

            //we reference our object on position i
            viewHolder0.file.setText(mObjects.get(i).getFile());
            //we do the same for sets
            viewHolder0.sets.setText(mObjects.get(i).getSets())
            Log.i("mLOG", "value of i = "+i);

            //now I want to change only the second object 
            if(i == 2){
                viewHolder0.max.setBackgroundResource(R.drawable.person_image);
                viewHolder0.max.setText("8");
            }
            

    }

它会在第二个位置更改对象,但它也会在 2 + 9 位置(2、11、20 ...)每隔一个更改一次,即使 LOG 中的值是 i= 1、2、3、4, 5,6...x 它再也不是 2 了。为什么会这样? 我只想对第二个位置的对象进行更改。

这是我在活动中打来的电话

    private void insertFakeInfo(){

        for (int i = 0; i < 100; i++){
            MaxWindow mMax = new MaxWindow();

            mMax.setFile("Whatever" + i);
            mMax.setSets("" + i);

            mObjects.add(mMax);
        }
        mMaxAdapter.notifyDataSetChanged();
    }
Thanks for any advice in advance. :)

【问题讨论】:

  • Recyclerview 正在使用重用视图的视图模式。这意味着当您滚动您的onBindViewHolder 时,可能会收到一个已用于显示不同位置的视图,因此您拥有的任何if 案例都必须有一个else,它将将所述视图恢复为“默认”状态。

标签: android android-studio android-recyclerview


【解决方案1】:

在您的代码中,添加突出显示的行

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder0, int i) 
{

    //we reference our object on position i
    viewHolder0.file.setText(mObjects.get(i).getFile());
    //we do the same for sets
    viewHolder0.sets.setText(mObjects.get(i).getSets())
    Log.i("mLOG", "value of i = "+i);

    //now I want to change only the second object 
    if(i == 2){
        viewHolder0.max.setBackgroundResource(R.drawable.person_image);
        viewHolder0.max.setText("8");
    }
    **else {
        viewHolder0.max.setBackgroundResource(R.drawable.some_other_image);
        viewHolder0.max.setText("some other string");
    }**
    

}

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2023-04-05
    • 2010-11-12
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多