2017-04-27 3 views
3

Ich habe eine Anforderung, wo ich das Anzeigenelement beim Scrollen herunterladen und die Liste aktualisieren sollte. Seit dem Aufruf notifyDatasetChnaged(), setzt alles zurück, ich rufe notifyItemInserted(position). Aber das ruft die Einträge in der Liste auf. Ich habe festgestellt, dass es keine wiederholten Einträge in der Liste gibt. Aber nach dem Aufruf notifyItemInserted, dupliziert es das Element. Ich verstehe nicht, wie ich dieses Problem lösen kann. Das was ich mache:Recyclerview.notifyItemInserted() dupliziert das Listenelement

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

Wenn ich anrufe, funktioniert es richtig, es gibt keine wiederholten Elemente. Aber ich möchte nicht, dass meine Listenelemente neu erstellt werden. Was kann das Problem sein?

+0

Was ist previousAdPosition hier? –

+0

previousAdspostion stammt aus dem Feed. Wir fügen die Anzeige an dieser Position ein –

+0

mNewsList.add (mPreviousAdPosition, newsItem); mAdapter.notifyItemInserted (mPreviousAdPosition); Wo legen Sie diese Linie? –

Antwort

-1

Sie sollten den Artikel am Ende der Liste hinzufügen.

mNewsList.add(newsItem); 

und dann wie folgt benachrichtigen.

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

Aber ich möchte den Artikel dazwischen hinzufügen? Es wird nicht für solche Fälle? –

+0

Entfernen Sie in Ihrem Code die Ansicht, bevor Sie notifyItemInserted aufrufen. Ex - yourlistview.removeViewAt (mPreviousAdPosition); –

+0

Aber ich habe eine große Liste und ich möchte alle Elemente in der Liste. Der Artikel, in den die Anzeige eingefügt wird, muss also unterhalb der Position des eingefügten Artikels liegen. –

0

Sie Code sollte wie folgt geschrieben werden:

müssen Sie
public class RecyclerViewAdapter extends RecyclerView.Adapter{ 

    ... 

    public void addData(int position, Item newsItem) { 

     mNewsList.add(position, newsItem); 

     notifyItemInserted(position); 

    } 

    ... 

} 

und dann addData den Spaß nennen

+0

Wie unterscheidet sich das von dem, was das OP bereits macht? – Varun

+0

Ich denke, mNewsList wurde nicht aktualisiert – sfigo

1

Sie das Objekt mit jedem Objekt mit am Ende des Arrays hinzufügen eine Position, mit der es in der Recycler-Ansicht gezeigt werden muss. Sortieren Sie dieses Array anhand der Position, bevor Sie notifyItemInserted(position) aufrufen. Auf diese Weise werden nur die erforderlichen Daten gezeichnet. Ich habe diesen Ansatz kürzlich befolgt und funktioniert sehr gut mit dynamischen Abschnitten, die in der Recycler-Ansicht hinzugefügt wurden.

0

eine temporäre Liste erstellen und Elemente hinzufügen, wie unten erwähnt:

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

ich für genau den gleichen Anwendungsfall das gleiche Problem hatte, ist die Lösung:

diese Methode implementieren in Ihrem Adapter:

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

Rufen Sie diese Methode im Konstruktor Ihrer Adapter:

//Indicates whether each item in the data set can be represented with a unique identifier 
setHasStableIds(true);