繁体   English   中英

无法使RecyclerView.Adapter正确显示

[英]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中发生任何输入?

RecyclerViewListViewGridView ,在可能的情况下会重用视图。 这意味着在滚动时,从顶部跌落的视图将用于底部的视图,依此类推。这大大提高了内存效率和滚动性能。 这意味着,如果您不重置新项目的所有状态,则会看到从上次使用该视图起剩下的状态。

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM