1

ここでこの例に従いました: 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);
    }
}

updateDisplayViewHolder クラス内にある私のメソッドは次のとおりです。

// 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
}

データが null になることがあるという事実と関係があると思うので、表示しないことにまし。すべてのアイテム (カード) に表示する画像があるわけではないため、アイテムに画像があるかどうかを確認します。もしそうなら、私は画像を表示するためにいくつかの派手なコードを実行します (そして、その画像のみを表示できるように他のビューを作成します)。GONE

デバッグ中に、すべてのカードの ID と位置をタイトルに表示するように強制しました。すべての ID と位置適切な場所にあることを確認できます。強制的に (id、タイトル、および概要の if チェックを削除して) ID、タイトル、および概要を表示するようにすると、null であっても、そのコンテンツは影響を受けなくなります。ただし、これは私の画像の状況を解決しません (常に画像があるとは限りません)。次に、特定の id/position の場所を占める画像をいくつか用意します(つまり、要約テキストを表示する代わりに、そこにあるはずのない画像を表示します)。

なぜこれが私の RecyclerView で起こっているのかについての情報はありますか?

4

5 に答える 5

12

RecyclerViewListViewは、および と同じようにGridView、可能な限りビューを再利用します。つまり、スクロールしている間、上から落ちたビューが下のビューなどに使用されます。これにより、メモリ効率とスクロール パフォーマンスが大幅に向上します。これは、新しいアイテムのすべての状態をリセットしないと、このビューが最後に使用されたときから残っている状態が表示されることを意味します。

代わりに、常にすべての状態をリセットする必要があります。

if (item.getID() != null) {
  mIDView.setText(item.getID());
} else {
  mIDView.setText("");
}
// etc...

また、チェックする必要がある状況があってはなりませんcardsData.isEmpty()- 代わりに、更新するたびに、リストを自動的に更新するcardsData適切なnotifyXXXメソッド ( notifyItemInserted()または最悪の場合はnotifyDataSetChanged()など) を呼び出す必要があります。適切に。

于 2014-10-27T03:25:03.217 に答える
4

埋め込む

public long getItemId(int position) {}

そうしないと、RecyclerViewに繰り返し項目が表示されます。

于 2015-04-07T08:08:12.987 に答える
3

これら2つを追加すると、準備完了です!

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
   return position;
}
于 2016-12-16T20:15:13.517 に答える