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
thanks..it half @Arbaz Rizvi –
Sie sind willkommen –
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 ? –