2017-04-27 11 views
3

リストをスクロールして更新する際に広告アイテムをダウンロードする必要があります。 notifyDatasetChnaged()を呼び出して以来、私はnotifyItemInserted(position)と呼んでいます。しかし、これを呼び出すと、リスト内の項目が複製されます。リストには何も繰り返されていないことがわかりました。しかし、notifyItemInsertedを呼び出した後、それはアイテムを複製します。私はこの問題を解決する方法を知りません。これは私がやっていること:Recyclerview.notifyItemInserted()はリストアイテムを複製します

mNewsList.add(mPreviousAdPosition, newsItem); 
mAdapter.notifyItemInserted(mPreviousAdPosition); 

私が電話すると、それは正しく動作し、何も繰り返されません。しかし、私はリストアイテムを再作成したくありません。何が問題なの?

+0

前のページに戻る –

+0

previous広告はフィードから取得されました。この位置に広告を挿入します。 –

+0

mNewsList.add(mPreviousAdPosition、newsItem); mAdapter.notifyItemInserted(mPreviousAdPosition); あなたはその行をどこに置いていますか? –

答えて

-1

リストの最後に項目を追加する必要があります。

mNewsList.add(newsItem); 

このように通知します。

public class RecyclerViewAdapter extends RecyclerView.Adapter{ 

    ... 

    public void addData(int position, Item newsItem) { 

     mNewsList.add(position, newsItem); 

     notifyItemInserted(position); 

    } 

    ... 

} 

、その後、あなたはあなたがそれぞれのオブジェクトが持つ配列の末尾にオブジェクトを追加することができますaddData

+0

しかし、その間にアイテムを追加しますか?そのような場合はありませんか? –

+0

コードでnotifyItemInsertedを呼び出す前にビューを削除します。例 - yourlistview.removeViewAt(mPreviousAdPosition); –

+0

しかし私は大きなリストを持っており、リスト内のすべてのアイテムが必要です。したがって、広告が挿入されるアイテムは、挿入されたアイテムの位置の下に来なければなりません。 –

0

リサイクラビューに表示する必要がある位置と一緒に表示されます。 notifyItemInserted(position)を呼び出す前に、この配列を位置に基づいて並べ替えます。この方法では、必要なデータのみが描画されます。私はこのアプローチに従いましたが、リサイクルビューでの間に追加された動的セクションでうまく機能します。

+0

これは、OPが既にやっていることとどのように違うのですか? – Varun

+0

mNewsListが更新されていないと思います – sfigo

1

楽しみを呼び出す必要があります:あなたのコードは次のように記述する必要があります

mAdapter.notifyItemInserted(mNewsList.size()-1); 
0

一時リストを作成し、後述するように項目を追加します。

List<YourModel> mTmpList = new ArrayList<YourMdel>(); 

//add items (from 0 -> mPreviousAdPosition) to mTmpList; 
for(int i=0; i<mPreviousAdPosition; i++) { 
    mTmpList.add(mNewsList.get(i)); 
} 

//add item at mPreviousAdPosition 
mTmpList.add(newsItem); 

//add remaining items and set i<=mNewsList.size() because we ha 
for(int i=mPreviousAdPosition; i<=mNewsList.size(); i++) { 
    mTmpList.add(mNewsList.get(i - 1)); //because we have added item at mPreviousAdPosition; 
} 

mNewsList = mTmpList; 
mAdapter.notifyDataSetChanged(); 
1

私はまったく同じユースケースのために同じ問題を抱えていた、解決策は次のとおりです。

あなたのアダプタでこのメソッドを実装します。

@Override 
public long getItemId(int position) { 
    //Return the stable ID for the item at position 
    return items.get(position).getId(); 
} 

あなたのアダプタのコンストラクタでこのメソッドを呼び出します。

//Indicates whether each item in the data set can be represented with a unique identifier 
setHasStableIds(true); 
関連する問題