[英]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.