2017-10-25 2 views
0

Ich habe versucht, RecyclerView-Header und -Footer nach Konvention zu implementieren, aber ungültige Indexfehler erhalten. Ich bin anscheinend in der Klemme. Wenn ich Kopf- und Fußzeile entferne, wird Recyclerview in Ordnung angezeigt. Ich habe +2 zur Arraylist-Größe hinzugefügt, aber es hilft nicht. Ich bekomme diese Ausnahme in onBindViewHolder() wenn Halter instanceOf ItemViewHolder. Es gibt kein Problem mit Glide. Unten ist mein Adapter Code:IndexOutOfBoundsException für Recyclerview Header und Footer

public class RecyclerViewAdapterCountry extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
private static final int TYPE_HEADER = 0; 
private static final int TYPE_FOOTER = 1; 
private static final int TYPE_ITEM = 2; 

private ArrayList<Country> mArrayList; 
private Context mContext; 

public RecyclerViewAdapterCountry(ArrayList<Country> mArrayList, Context mContext) { 
    this.mArrayList = mArrayList; 
    this.mContext = mContext; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    if (viewType == TYPE_ITEM) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_list, parent, false); 
     return new ItemViewHolder(view); 
    } 
    if (viewType == TYPE_HEADER) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_header, parent, false); 
     return new HeaderViewHolder(view); 


    } else if (viewType == TYPE_FOOTER) { 
     //Inflating footer view 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_footer, parent, false); 
     return new FooterViewHolder(itemView); 
    } else return null; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    if (holder instanceof HeaderViewHolder) { 
     HeaderViewHolder headerHolder = (HeaderViewHolder) holder; 
     headerHolder.headerFlag.setText("Flag"); 
     headerHolder.headerCountry.setText("Country"); 
     headerHolder.headerPopulation.setText("Population"); 
     headerHolder.headerCountry.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(mContext, "You clicked at Header View!", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } else if (holder instanceof FooterViewHolder) { 
     ((FooterViewHolder) holder).footerFlag.setText("Footer"); 
    } else if (holder instanceof ItemViewHolder) { 
     ItemViewHolder itemViewHolder=(ItemViewHolder)holder; 
     Glide.with(mContext).load(mArrayList.get(position).getImagePath()).into(itemViewHolder.imageViewCountryFlag); 
     itemViewHolder.textViewCountryName.setText(mArrayList.get(position).getCountry()); 
     itemViewHolder.textViewcountryPopulation.setText(mArrayList.get(position).getPopulation()); 
    } 
} 

@Override 
public int getItemCount() { 
    return mArrayList.size()+2; 
} 

@Override 
public int getItemViewType(int position) { 
    if (position == 0) { 
     return TYPE_HEADER; 

    } else if (position == mArrayList.size() + 1) { 

     return TYPE_FOOTER; 
    } 
    return TYPE_ITEM; 
} 

private class HeaderViewHolder extends RecyclerView.ViewHolder { 
    TextView headerFlag, headerCountry, headerPopulation; 

    public HeaderViewHolder(View view) { 
     super(view); 
     headerFlag = (TextView) view.findViewById(R.id.textViewHeaderFlag); 
     headerCountry = (TextView) view.findViewById(R.id.textViewHeaderCountryName); 
     headerPopulation = (TextView) view.findViewById(R.id.textViewHeaderCountryPopulation); 
    } 
} 

private class FooterViewHolder extends RecyclerView.ViewHolder { 
    TextView footerFlag, footerCountry, footerPopulation; 

     public FooterViewHolder(View view) { 
      super(view); 
      footerFlag = (TextView) view.findViewById(R.id.textViewFooterFlag); 
      footerCountry = (TextView) view.findViewById(R.id.textViewFooterCountryName); 
      footerPopulation = (TextView) view.findViewById(R.id.textViewFooterCountryPopulation); 
    } 
} 

private class ItemViewHolder extends RecyclerView.ViewHolder { 
    ImageView imageViewCountryFlag; 
     TextView textViewCountryName, textViewcountryPopulation; 

     public ItemViewHolder(View itemView) { 
      super(itemView); 
      imageViewCountryFlag = (ImageView) itemView.findViewById(R.id.imageViewFlag); 
      textViewCountryName = (TextView) itemView.findViewById(R.id.textViewListContryName); 
      textViewcountryPopulation = (TextView) itemView.findViewById(R.id.textViewListCountryPopulation); 
     } 
    } 
} 

Hier ist die Ausnahme, die ich auf dem Monitor erhalten:

E/AndroidRuntime: FATAL EXCEPTION: main 
    java.lang.IndexOutOfBoundsException: Invalid index 10, size is 10 
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
    at java.util.ArrayList.get(ArrayList.java:304) 
    at com.example.user.recyclerviewheaderfooter.RecyclerViewAdapterCountry.onBindViewHolder(RecyclerViewAdapterCountry.java:69) 
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356) 
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389) 
    at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5335) 
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5598) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440) 
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436) 
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224) 
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551) 
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511) 
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595) 
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583) 
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3025) 
    at android.view.View.measure(View.java:15518) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
    at 

Antwort

0

Try Below Code

public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
if (holder instanceof HeaderViewHolder) { 
    HeaderViewHolder headerHolder = (HeaderViewHolder) holder; 
    headerHolder.headerFlag.setText("Flag"); 
    headerHolder.headerCountry.setText("Country"); 
    headerHolder.headerPopulation.setText("Population"); 
    headerHolder.headerCountry.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(mContext, "You clicked at Header View!", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} else if (holder instanceof FooterViewHolder) { 
    ((FooterViewHolder) holder).footerFlag.setText("Footer"); 
} else if (holder instanceof ItemViewHolder) { 
    ItemViewHolder itemViewHolder=(ItemViewHolder)holder; 
    position = position -1; 
    Glide.with(mContext).load(mArrayList.get(position).getImagePath()).into(itemViewHolder.imageViewCountryFlag); 
    itemViewHolder.textViewCountryName.setText(mArrayList.get(position).getCountry()); 
    itemViewHolder.textViewcountryPopulation.setText(mArrayList.get(position).getPopulation()); 
}} 
+0

thanks..it half @Arbaz Rizvi –

+0

Sie sind willkommen –

+0

eine andere Sache, die ich gerne fragen würde: Wenn ich Boolean IsHeader und IsFooter zu meinem Element Klasse hinzufügen, dann brauche ich nicht +2 zu hinzufügen arraylist.size und ich sollte nicht subtrahieren -1 in onBindViewHolder(), aber es zeigt Fehler auf diese Weise. Irgendeine Idee ? –

0

Ihre Datenarray 0..n Elemente enthält. Sie haben die Länge definiert n + 2 und die Artikel Ansichten immer von 1.

versetzt wird, um sein jedoch in Ihrer verbindlichen Methode Sie .get(position) statt .get(position - 1) zugreifst für den Header zu berücksichtigen position = 0 nehmen. Dies bedeutet, dass es am Ende um eins aus ist und die AIOOB-Exception verursacht.

+0

thanks..i it..nice Erklärung bekam. –

Verwandte Themen