13

Я преобразовываю свой ListView в RecyclerView с помощью библиотеки поддержки v7.Получение позиции в onCreateViewHolder

У меня есть 2 разных макета для загрузки в RecyclerView. В ListView я получал позицию элемента в методе getView() и смог загрузить соответствующий макет для этой строки. Но в RecyclerViewonCreateViewHolder не имеет параметра положения.

Есть ли другой способ достичь этого?

PS: Приложение Inbox от Google показывает различные макеты в 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); 
    } 
+0

Ваш второй параметр - 'viewType', я думаю, что это то, что вы хотите. – rom4ek

+0

Это то, что я и подумал сначала. Но его нет. Его единственный вид зрения, а не позиция. – Sathesh

+0

другой способ думать: switch (viewType) вместо vo.getType() –

ответ

32

Во-первых, переопределить 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 становятся нулевыми, и только элементы layout2 доступны в onBindViewHolder() – Sathesh

+0

Это определенно работает, но не является хорошим решением, когда несколько элементов данных принадлежат к одному и тому же (например, в ситуации, когда необходимо добавить заголовок и нижний колонтитулы вокруг списка). Я бы не хотел создавать случаи для каждого элемента в списке, поскольку все они принадлежат к одному типу вида. – user1841702

Смежные вопросы