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()),这将自动刷新列表适当.
| 归档时间: |
|
| 查看次数: |
5607 次 |
| 最近记录: |