未显示空状态RecyclerView的项目

时间:2017-04-06 20:25:43

标签: android android-recyclerview

我希望在没有要显示的项目时显示“空状态”视图,而我所做的是添加另一个viewType:

private static final int ITEM = 0;
private static final int LOADING = 1;
private static final int EMPTY_STATE = 2;

@Override
public int getItemCount() {
    return dataset == null ? 1 : dataset.size();
}

@Override
public int getItemViewType(int position) {
    if (dataset == null) {
        return EMPTY_STATE;
    } else if (position == dataset.size() - 1 && isLoadingAdded) {
        return LOADING;
    } else {
        return ITEM;
    }
}

如果dataset == null,我将返回空状态的视图。

我还为:

添加了适当的代码
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case ITEM:
            viewHolder = getFeedItemViewHolder(parent, inflater);
            break;
        case LOADING:
            viewHolder = new LoadingVH(inflater.inflate(R.layout.item_loading, parent, false));
            break;
        case EMPTY_STATE:
            viewHolder = new EmptyStateVH(inflater.inflate(R.layout.textview_first_time_text, parent, false));
            break;
    }
    return viewHolder;
}

onBindViewHolder

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

    switch (getItemViewType(position)) {
        case ITEM:
             // code here...
           break;
        case EMPTY_STATE:
            final EmptyStateVH emptyStateVH = (EmptyStateVH) holder;
            break;
     }
}

但上面的代码不起作用。不应该使用Null数据集返回EMPTY_VIEW?逻辑是否错误,我应该找到另一种方法来做到这一点?我想要避免的是将逻辑移动到我所拥有的Activity,即FrameLayout,其中空状态的不可见重叠视图,我将可见性更改为VISIBLE没有物品。我想避免它,因为我有一个MainActivity和许多Fragment,我想为每个使用不同的空状态。

谢谢!

2 个答案:

答案 0 :(得分:3)

弱点接缝在这里:

@Override
public int getItemCount() {
    return dataset == null ? 1 : dataset.size();
}

如果您的数据集不是null,但只是空(dataset.size()== 0),这基本上会破坏您的代码。一点点修复就可以防止这种情况发生:

@Override
public int getItemCount() {
    return (dataset == null || dataset.isEmpty()) ? 1 : dataset.size();
}

答案 1 :(得分:0)

试试这个:

private static final int ITEM = 0;
private static final int LOADING = 1;
private static final int EMPTY_STATE = 2;

@Override
public int getItemCount() {
    return dataset.size() == 0? 1 : dataset.size();
}

@Override
public int getItemViewType(int position) {
    if (dataset.size() == 0) {
        return EMPTY_STATE;
    } else if (position == dataset.size() - 1 && isLoadingAdded) {
        return LOADING;
    } else {
        return ITEM;
    }
}