簡體   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