【问题标题】:Getting position in onCreateViewHolder在 onCreateViewHolder 中获得位置
【发布时间】:2014-11-03 05:49:46
【问题描述】:

我正在使用支持库 v7 将我的 ListView 转换为 RecyclerView。

我有 2 种不同的布局要加载到 RecyclerView 中。在ListView 中,我在getView() 方法中获取了项目的位置,并且能够为该行加载适当的布局。但在RecyclerViewonCreateViewHolder 中没有位置参数。

还有其他方法可以实现吗?

PS:来自 Google 的 Inbox 应用在 RecyclerView(可能是)中显示不同的布局。我认为他们可能不会使用 ListView,因为 RecyclerView 的性能有所改进

@Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View v=null;

            MyVO vo = voList.get(???POSITION???);

            switch(vo.getType()){
                case TYPE_1:
                    v = LayoutInflater.from(viewGroup.getContext())
                            .inflate(R.layout.layout1, viewGroup, false);
                    break;
                case TYPE_2:
                    v = LayoutInflater.from(viewGroup.getContext())
                            .inflate(R.layout.layout2, viewGroup, false);
                    break;
            }
        return new ViewHolder(v);
    }

【问题讨论】:

  • 你的第二个参数是viewType,我想这就是你想要的。
  • 我一开始也是这么想的。但它不是。它只是视图的类型,而不是位置。
  • 另一种思路:switch(viewType) 而不是 vo.getType()
  • @Mohamed 我猜 MyVO 将是一个数据模型,它不仅包含一个值,而且还包含一种用于显示该值的小部件/布局。通常,您的数据集是原始值的集合,Sathesh'es 是 MyVO 的集合。我不确定每个单元格有一个模型是个好主意,我喜欢每行有一个模型的想法。

标签: android listview android-5.0-lollipop android-recyclerview


【解决方案1】:

首先,覆盖getItemViewType方法:

@Override
public int getItemViewType(int position) {
    //Implement your logic here
    MyVO vo = voList.get(position);
    return vo.getType();
}

那么你可以简单地使用onCreateViewHolder的第二个参数:

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View v=null;

        switch(viewType){
            case TYPE_1:
                v = LayoutInflater.from(viewGroup.getContext())
                        .inflate(R.layout.layout1, viewGroup, false);
                break;
            case TYPE_2:
                v = LayoutInflater.from(viewGroup.getContext())
                        .inflate(R.layout.layout2, viewGroup, false);
                break;
        }
    return new ViewHolder(v);
}

【讨论】:

  • 是的。有用。但问题是,在调用 notifyDataSetChanged() 后,layout1 元素变为 null,onBindViewHolder() 中只有 layout2 元素可用
  • 当多个数据项属于同一视图类型时(例如,在需要在列表周围添加页眉和页脚的情况下),这绝对有效,但不是一个好的解决方案我' d 不想为列表中的每个项目创建案例,因为它们都属于相同的视图类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2021-06-24
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多