[英]Can't get RecyclerView.Adapter to Properly Display
我在此遵循以下示例: 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);
}
}
这是在ViewHolder类中找到的我的updateDisplay
方法:
// 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
}
我相信这是与, 有时数据是无效的事实,所以我选择不显示它。 并非所有项目(卡片)都将显示图像,因此这就是为什么我检查项目是否应该具有图像的原因。 如果是这样,那么我将执行一些精美的代码来显示图像(并使其他视图GONE
这样我只能显示该图像等)。
调试时,我强制所有卡在标题中显示其ID和位置。 我可以确认所有ID和位置都在正确的位置。 当我强制(删除ID,标题和摘要的if检查)显示的ID,标题和摘要(即使为null)时,该内容不会受到影响。 但是,这不能解决我的图像情况(并不总是有图像)。 然后,我将有一些图像占用的地方一定ID /位置,它不应该(即不是显示摘要文本的,它表明不应该在那里的图像)。
关于为什么在我的RecyclerView中发生任何输入?
RecyclerView
与ListView
和GridView
,在可能的情况下会重用视图。 这意味着在滚动时,从顶部跌落的视图将用于底部的视图,依此类推。这大大提高了内存效率和滚动性能。 这意味着,如果您不重置新项目的所有状态,则会看到从上次使用该视图起剩下的状态。
相反,您应该始终重置所有状态:
if (item.getID() != null) {
mIDView.setText(item.getID());
} else {
mIDView.setText("");
}
// etc...
另外,在任何情况下都不需要检查cardsData.isEmpty()
-相反,每当更新cardsData
,都应该调用适当的notifyXXX
方法(例如notifyItemInserted()或更糟糕的情况是notifyDataSetChanged()) ),则会自动刷新相应的列表。
实行
public long getItemId(int position) {}
否则,您将在RecyclerView中看到重复的项目。
加上这两个,您就可以开始了!
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
另外,除了先前的答案,您还可以检查关于空虚的视图,例如:
if (TextUtils.isEmpty(viewHolder.item.getText())) {
viewHolder.item.setText(object.getItem());
}
详细阐述ViliusK的答案。 此实现将起作用:
@Override
public long getItemId(int position) {
Object obj = getItemAtPosition(position);
return obj.hashCode();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.