2016-05-13 18 views
1

Ich habe eine Liste, wo ich für jedes nächste Element 5 verschiedene Ansicht aufblasen und diese Ansicht ist Banner für Werbung. Aber jetzt bekomme ich einen Fehler in der Methode getItemViewType(). Dies ist, wie mein Code aussieht:IndexOutOfBoundsException auf RecyclerView-Adapter mit mehreren Ansichtstypen

@Override 
public int getItemViewType(int position) { 
    if (jokes.get(position) != null) { 
     // Here i should catch every 5 element in jokes array and change view 
     if (position % 5 == 0 && position != 0) { 
      return VIEW_TYPE_BANNER; 
     } 
     return VIEW_TYPE_ITEM; 
    } else { 
     return VIEW_TYPE_LOADING; 
    } 
} 

Und das ist Methode getItemCount():

@Override 
public int getItemCount() { 
    return jokes == null ? 0 : jokes.size() + jokes.size()/5; 
} 

Hinweis: Ich Abrufen 18 Artikel von API.

EDIT:

Ein Punkt ist hier am unteren Rand der Liste fehlt.

enter image description here

+1

Wenn die Größe 18 ist, dann sind gültige Indizes 0-17 inklusive. 'position

+0

Woher rufen Sie die getItemViewType() -Methode auf? Bitte fügen Sie den Aufruf – PeaceIsPearl

+0

hinzu 'getItemCount()' macht keinen Sinn und ist völlig irrelevant. – shmosel

Antwort

1

Ich glaube, Sie etwas entlang der Linien tun sollten von:

@Override 
public int getItemViewType(int position) { 
    if (position % 5 == 0 && position != 0) { 
     return VIEW_TYPE_BANNER; 
    } else if (position == getItemCount() - 1) { 
     // Last item. Return the loading view. 
     return VIEW_TYPE_LOADING; 
    } else { 
     return VIEW_TYPE_ITEM; 
    } 
} 

@Override 
public int getItemCount() { 
    return jokes == null ? 0 
     : jokes.size() + jokes.size()/5 + 1; 
} 

Denken Sie daran, dass, wenn Sie die VIEW_TYPE_ITEM mit einer Position binden, können Sie nichtnennen. Sie müssen Banneransichten berücksichtigen, die Sie zuvor eingefügt haben. Also jokes.get(position - numberOfBannersBeforePosition).

+0

Ohne 'Witze.Größe()/5 + 1' bekomme ich keinen Fehler, aber der Fortschrittsbalken wird ständig unten geladen. –

+0

@Dusan so? Das machen Fortschrittsbalken. In Bezug auf die Stückzahl, wie ich sehe, sollte mein Vorschlag richtig sein. Wenn 'wokes.size()' 18 ist, möchten Sie 18 '+' 3 Banner (bei 5, 10, 15) haben, was 'Math.floor (18/5)', '+' 1 Element im Ende. So habe ich deine Frage gelesen. – natario

+0

Ich weiß, dass es sein sollte, aber warum es ständig lädt. Ich habe EndlessRecyclerView implementiert und es sollte neue Seite laden. Es lädt die zweite Seite, lädt aber das letzte Element nicht. Lass mich es dir zeigen. –

1

, was Sie zu tun versuchen, ist endlos recyclerview implementieren.

in Ihrem recyclerview Adapter schreiben wie diese

public class DataAdapter extends RecyclerView.Adapter { 
private final int VIEW_TYPE_ITEM = 1; 
private final int VIEW_TYPE_LOADING = 0; 
private final int VIEW_TYPE_BANNER = 2; 

...... 
...... 

@Override 
public int getItemViewType(int position) { 
if (jokes.get(position) != null) { 
    if (position % 5 == 0 && position != 0) { 
     return VIEW_TYPE_BANNER; 
    } 
    return VIEW_TYPE_ITEM; 
} else { 
    return VIEW_TYPE_LOADING; 
    } 
    } 
} 


@Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { 
RecyclerView.ViewHolder vh; 
if (viewType == VIEW_TYPE_ITEM) { 
View v = LayoutInflater.from(parent.getContext()).inflate(
R.layout.list_row, parent, false); 
vh = new StudentViewHolder(v); 
} 
if(viewType == VIEW_TYPE_LOADING){ 
View v = LayoutInflater.from(parent.getContext()).inflate(
R.layout.progress_item, parent, false); 
vh = new ProgressViewHolder(v); 
} 
if(viewType == VIEW_TYPE_BANNER){ 
//load your banner layout 
} 
return vh; 
} 

@Override 
public int getItemCount() { 
return studentList.size(); 
} 

und Ihre Logik halten, ob Sie Artikel oder Banner oder Laden von Ihrer Haupttätigkeit Datei ermöglichen sollte

+0

Ja, aber ich habe noch eine weitere Ansicht. –

+0

Für jedes fünfte Element in der Liste habe ich ein Banner, wo ich Anzeigen ausstelle. –

Verwandte Themen