Android将标头添加到RecyclerView不会显示所有列表项

时间:2019-03-08 12:46:24

标签: android android-recyclerview

我正在尝试将标题添加到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异常。

任何帮助将不胜感激。

谢谢

1 个答案:

答案 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();
        }
    }
}