在onCreateViewHolder中获取位置

问题描述:

我正在使用Support Library v7将我的ListView转换为RecyclerView。在onCreateViewHolder中获取位置

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

有没有其他办法可以达到这个目的?

PS:Google的收件箱应用程序在RecyclerView(可能)中显示不同的布局。我不认为他们会在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); 
    } 
+0

你的第二个参数是'viewType',我认为这是你想要的。 – rom4ek 2014-11-03 05:53:39

+0

这就是我最初也想到的。但不是。它只是视图的类型而不是位置。 – Sathesh 2014-11-03 05:55:27

+0

另一种思考方式:switch(viewType)而不是vo.getType() – 2014-11-03 05:59:31

首先使用了ListView由于性能的提升,覆盖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); 
} 
+0

是的。有用。但问题是,在调用notifyDataSetChanged()之后,layout1元素将变为null,并且onBindViewHolder()中只有layout2元素可用() – Sathesh 2014-11-03 09:26:17

+0

当许多数据项属于同一个数时,这绝对有效但不是一个好的解决方案视图类型(例如,在需要在列表中添加页眉和页脚的情况下)我不想为列表中的每个项目创建案例,因为它们都属于相同的视图类型。 – user1841702 2016-07-14 10:01:59