无法使RecyclerView.Adapter正确显示

use*_*234 1 android android-recyclerview

我在这里遵循了这个例子:https://developer.android.com/training/material/lists-cards.html

发生了什么:

列表(RecyclerView)在滚动时混合数据.即,当我向下滚动后向上滚动时,会重复一些列表项,而不会显示正确的内容.

这是我的onBindViewHolder方法:

// cardsData is a List of MyCardItem (MyCardItem is just a holder of information,
// such as an id, String title, String summary, and other info to display on a card
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position)
{
    // Update view here
    if (!cardsData.isEmpty())
    {
        viewHolder.updateDisplay(cardsData.get(position), activity, position);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我updateDisplay在ViewHolder类中找到的方法:

// Set ID
if (item.getID() != null)
{
    mIDView.setText(item.getID());
}

// Set Title
if (item.getTitle() != null)
{
    mTitleView.setText(item.getTitle());
}

// Set Summary
if (item.getSummary() != null)
{
    mSummaryView.setText(Html.fromHtml(item.getSummary()));
}

// Image
if (item.hasImage())
{
    // Display image here
}
Run Code Online (Sandbox Code Playgroud)

我相信它有一些做的事实有时数据是空的,所以我选择不显示它.并非所有项目(卡片)都有要显示的图像,因此这就是我检查项目是否应该有图像的原因.如果是这样,那么我会做一些花哨的代码来显示图像(并制作其他视图GONE以便我只能显示该图像等).

在调试时,我强制所有卡片在标题中显示其ID和位置.我可以确认所有的ids和位置在适当的位置.当我强制(删除if检查id,title和summary)时,要显示的id,title和summary,即使为null,该内容也不会受到影响.但是,这并不能解决我的图像情况(不会总是有图像).然后,我将有一些图像占用的地方一定ID /位置,它应该不是(即不是显示摘要文本的,它表明不应该在那里的图像).

有关为什么在我的RecyclerView中发生这种情况的任何输入?

ian*_*ake 12

RecyclerView,ListView和the一样GridView,尽可能重用视图.这意味着当您滚动时,从顶部掉落的视图将用于底部的视图等.这极大地提高了内存效率和滚动性能.这意味着如果您没有重置新项目的所有状态,您将看到上次使用此视图时遗留的状态.

相反,您应该始终重置所有状态:

if (item.getID() != null) {
  mIDView.setText(item.getID());
} else {
  mIDView.setText("");
}
// etc...
Run Code Online (Sandbox Code Playgroud)

此外,不应该有任何需要检查的情况cardsData.isEmpty()- 相反,每当您更新时cardsData,您应该调用适当的notifyXXX方法(例如notifyItemInserted()或更坏的情况notifyDataSetChanged()),这将自动刷新列表适当.