【问题标题】:Draw empty cells in RecyclerView在 RecyclerView 中绘制空单元格
【发布时间】:2017-06-14 07:42:41
【问题描述】:

就我而言,我有Grid Layout Manager 和自定义Decorator 的回收站视图。在每一行(最多有 3 列)中可以有 1 到 3 个项目。

问题是如果行中的项目数为一或两个,如何绘制空单元格? Warning!!!这不是lastRow

示例: Span 第 3 行计数,从集合到绘制的元素 = 2 如何在第 3 列绘制空单元格? Span 第 3 行计数,从集合到绘制的元素 = 1 如何在第 2 列和第 3 列中绘制空单元格?

【问题讨论】:

  • 我可以考虑添加“虚拟”空数据(null),当数据为空时,在适配器中绘制一个空字段。也许其他人知道更好的解决方案:D
  • @Vucko 感谢兄弟的回复,就我而言,这是一个糟糕的选择,所以我问了这个问题以寻找更奇特的解决方案。由于在 Google 中的搜索没有任何结果。
  • 这个question的第二个答案怎么样
  • 您能说出您的用例吗?画那些空单元格有什么意义?

标签: android android-recyclerview gridlayoutmanager


【解决方案1】:

Recyclerview 的适配器必须知道视图。为此,我们使用getItemViewType。通过获取视图类型,我们可以将任何视图添加到recyclerview。

public class MainRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private final static int ADD_VIEW_HOLDER = 0;
private final static int EMPTY_VIEW_HOLDER = 1;

public List<DataList> mDrinkItems;


@Override
public int getItemViewType(int position) {
    if (position== mDrinkItems.size()-1)
        return EMPTY_VIEW_HOLDER;
    else
        return ADD_VIEW_HOLDER;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    switch (viewType){
        case ADD_VIEW_HOLDER:
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.li_main_content,parent,false);
            return new MainItemHolder(view);
        case EMPTY_VIEW_HOLDER:
            View EMPTYView= LayoutInflater.from(parent.getContext()).inflate(R.layout.li_EMPTY_action,parent,false);
            return  new EMPTYViewItemHolder(EMPTYView);
            default:
                 return null;
    }
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    int size= mDrinkItems.size();
    switch (getItemViewType(position)){
        case ADD_VIEW_HOLDER:
            ((MainItemHolder)holder).bindData(mDrinkItems.get(position),position,size);
            break;
        case EMPTY_VIEW_HOLDER:
            ((EMPTYViewItemHolder)holder).bindData(mDrinkItems.get(position),position,size);
            break;
    }

}

@Override
public int getItemCount() {
    return mDrinkItems.size();
}

public void setData(List<DailyConsumption> mlist) {
    this.mDrinkItems = mlist;
    notifyDataSetChanged();
}

将数据添加到列表以设置适配器时,您将获得列表的最后一个索引以设置空视图。

List<DataList> mList = new ArrayList<>();
mList.add(mList.size(),new DataList(// whatever you want to add));

【讨论】:

    【解决方案2】:

    您可以通过定义不同的视图类型来实现。

    只需覆盖 getItemViewType()

    @Override
        public int getItemViewType(int position) {
                if (position < mElementsList.size()) {
                    return ITEM_TYPE_NORMAL;
                } else if (position >= mElementsList.size()) {
                    return ITEM_TYPE_EMPTY;
                }
            }
        }
    

    然后覆盖 onCreateViewHolder

    onCreateViewHolder(Viewgroup parent, int viewType) {
       if(viewType == ITEM_TYPE_NORMAL) {
         //Use layout for normal type
       } else if (viewType == ITEM_TYPE_EMPTY) {
         //Use layout for emptyType
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2011-08-06
      • 2018-03-17
      • 2018-01-08
      相关资源
      最近更新 更多