我正在尝试将标题添加到RecyclerView列表的列中。添加标题时,不会显示所有列表项。请在下面找到相关代码:
@Override
public int getItemCount() {
return (myList == null)? 0 : myList.size();
}
@Override
public int getItemViewType(int position) {
if (myList.get(position) == null) return -1;
if (isPositionHeader(position))
return ItemType.HEADER.getTypeCode();
else
return ItemType.ITEM.getTypeCode();
}
private boolean isPositionHeader(int position) {
return position == 0;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof myListViewHolder) {
((myListViewHolder)
holder).bindData(myList.get(position-1));
}
else if (holder instanceof myHeaderViewHolder){
Log.d("RecyclerAdapter", "Setting Headers");
}
// Rest of the code
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
if (viewType == ItemType.ITEM.getTypeCode()) {
return new
myListViewHolder(inflater.inflate(R.layout.my_list_item, parent, false),
callback);
}
else if (viewType == ItemType.HEADER.getTypeCode()) {
return new
myHeaderViewHolder(inflater.inflate(R.layout.my_header_item, parent, false),
callback);
}
else {
return new LoadViewHolder(inflater.inflate(R.layout.loading_view,
parent, false));
}
}
protected Profile getItemByPosition(int position) {
return myList.get(position);
}
@Override
public long getItemId(int position) {
if (getItemByPosition(position) == null) return -1;
return getItemByPosition(position).getId().hashCode();
}
使用上面的代码,标题显示在第0个位置,接下来显示列表项,而保留最后一个项目,即,如果list具有5个元素,则仅显示4个元素。 我试图在getItemCount()中返回myList.size()+1,但这会引发IndexOutOfBounds异常。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
我注意到您尚未实现https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#createViewHolder(android.view.ViewGroup,%20int)中的createViewHolder
。这有助于RecyclerView确定是使用标题还是列表项视图持有人。
似乎getItemCount
方法的实现不正确-它必须是标题数+项目数。
然后修复如下方法:
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position))
return ItemType.HEADER.getTypeCode();
else {
if(myList.get(position - 1) == null){
return -1;
}
else {
return ItemType.ITEM.getTypeCode();
}
}
}