2016-09-25 2 views
4

ich eine RecyclerView mit einem horizontalen linearen Layout-Manager haben wie folgt erklärt:Android RecyclerView Adapter: notifyItemInserted und notifyItemMoved bei Index 0 nicht funktioniert

RecyclerView graph = (RecyclerView) findViewById(R.id.graph); 

RecyclerView.LayoutManager classManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); 
graph.setLayoutManager(classManager); 
graph.addItemDecoration(new ComponentDecorator(this)); //Just sets a margin around each item 

Ich habe eine Methode, die wie diese einen Platzhalter Blick in die RecyclerView Einsätze :

private void insertPlaceholder(int index) { 
    int placeholderIndex = getIndexOfPlaceholder(); //returns index of existing placeholder, -1 if none 

    //No need to do anything 
    if(placeholderIndex == index) 
     return; 

    if(placeholderIndex == -1) { 
     ClassGraphItem placeholder = new ClassGraphItem(); 
     placeholder.setType(ClassGraphItem.PLACEHOLDER); 

     mItems.add(index, placeholder); 
     Print.log("notify item inserted at index", index); 
     notifyItemInserted(index); 
    } 
    else { 
     ClassGraphItem placeholder = mItems.get(placeholderIndex); 
     mItems.remove(placeholderIndex); 
     mItems.add(index, placeholder); 

     notifyItemMoved(placeholderIndex, index); 
    } 
} 

Der Platzhalter ist nur ein unsichtbares Ansicht, die eine Raumöffnung zwischen zwei vorhandenen Ansichten simuliert:

private class PlaceholderViewHolder extends RecyclerView.ViewHolder { 

    public PlaceholderViewHolder(View itemView) { 
     super(itemView); 

     ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(mComponentWidth, 1); 
     itemView.setLayoutParams(params); 

     itemView.setVisibility(View.INVISIBLE); 
    } 

} 

Wenn der eingefügte Index> 0 ist, funktioniert es einwandfrei. Bei Index 0 funktioniert jedoch entweder das Einfügen eines Platzhalters oder das Verschieben eines vorhandenen Platzhalters in den Index 0 nicht, insbesondere repliziert die RecyclerView das neue Element nicht, das am Index 0 eingefügt wurde. Wenn ich notifyDataSetChanged() verwendet habe, funktioniert es. aber das animiert nicht und ist nicht der Effekt, nach dem ich suche. Das scheint mir ein Fehler zu sein, aber ich wollte sicherstellen, dass es nichts anderes gibt, was dieses Problem verursacht.

Ich bin auf der neuesten Version der Recyclerview-Support-Bibliothek (24.2.1). Vielen Dank!

+0

Es war ein Fehler in 22.x, wurde aber in 23.x behoben. Wenn Sie 24.2.1 verwenden, sollten Sie Ihren Code unbedingt überprüfen. –

+0

Und wenn es immer noch nicht funktioniert, einen Fehler im Issue Tracker einreichen. –

+0

Ich erlebe das gleiche Problem auf 25.0.0 –

Antwort

9

Ich entfernte recycler.setHasFixedSize(true); und jetzt funktioniert es. Ich habe keine Ahnung, warum das so sein sollte.

+1

Interessant, ich werde dies versuchen und lassen Sie wissen, wie es geht. Vielen Dank! Fühlen Sie sich frei, mich anzumelden, wenn ich vergesse, meine Ergebnisse zu melden. – JMRboosties

+1

Sie haben vergessen, Ihre Ergebnisse zu melden @ JMRboosties: p – Mauker

+0

Es funktionierte in meinem Fall. Meiner Meinung nach sagt setHasFixedSize dem Recyclerview, seine Größe nicht zu ändern, so dass das Entfernen oder Hinzufügen von Elementen die Recycleransicht nicht aktualisiert. notifyDataSetChanged stattdessen erzwingen die Recyclerview vollständig neu zu zeichnen und so funktioniert es aber ohne Animationen – DSoldo

Verwandte Themen