我希望在没有要显示的项目时显示“空状态”视图,而我所做的是添加另一个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
,我想为每个使用不同的空状态。
谢谢!
答案 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;
}
}