0

Я использую следующий code в адаптере класса show data в RecyclerView, но теперь я хотел бы показать данные из некоторых других ArrayList в же RecyclerView (в some positions например: 1-я позиция и 6-я позиция) с использованием различной компоновки.RecyclerView показывает данные из 2-х различных макетов

Это другая раскладка (предположит: another_layout.xml) содержит 2 TextViews и изображения также хочет реализовать нажмите на слушателе для этого макета тоже ..

@Override 
    public PlaylistCardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // inflate a card layout 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.youtube_video_card, parent, false); 
     // populate the viewholder 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

ответ

1

RecyclerView более одного макета
1. Override getItemViewType (целое положение) метод
например у меня есть две раскладки Layout1 и layout2.I хотят Layout1 в верхней части, а затем Layout2. Так getItemViewType будет что-то вроде этого

@Override 
public int getItemViewType(int position) { 

    if(position == 0){ //for layout1 
     return 1; 
    }else{ 
     return 2;  //for layout2 
    } 
} 

2. Различные viewholder для каждого макета, как этот

class ViewHolder_LayoutOne extends RecyclerView.ViewHolder{ 
    TextView name; 
    //Constructor 
} 

class ViewHolder_LayoutTwo extends RecyclerView.ViewHolder{ 
    TextView name; 
    //Constructor 
} 

3. Надуйте различные схемы в соответствии с положением

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

    RecyclerView.ViewHolder vh = null; 
    if(viewType == 1){ 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout_one,parent,false); 
     vh = new MyViewHolder_LayoutOne(view); 
    }else if(viewType == 2){ 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_layout_two,parent,false); 
     vh = new MyViewHolder_LayoutTwo(view); 
    } 
    return vh; 
} 

4. Bind ваш в соответствии с позицией

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { 


    switch(getItemViewType(position)){ 

     case 1: //for layout 1 
      ((ViewHolder_LayoutOne)holder).name.setText(""); 
      break; 

     case 2:// for layout 2 
      ((ViewHolder_LayoutTwo)holder).name.setText(""); 
      break; 
    } 
} 
Метод

5.Now Наиболее важный getItemCount() // возвращает число просмотров

@Override 
public int getItemCount() { 
    return toptitles.length + 1; 
    // as i have only layout at the top and the remaining size equals the length of the array toptitles.So the overall length would be 
    //number of views of layout1 + number of views of layout2 
} 

Надеется, что это помогает !!!

+0

Я пробовал, как вы упомянули меня, но я получаю проблемы/ошибки во многих местах своего класса Adapter, можете ли вы внести изменения в мой существующий класс адаптера ... который я опубликовал выше – Sophie

+0

, посмотрим на это (проект популярного приложения для udacity) https: // github .com/gosemathraj/Cinema/blob/master/app/src/main/java/com/gosemathraj/cinema/adapters/RecyclerViewCustomAdapter.java –

+0

для каждой третьей позиции ваш getItemViewType просто проверяет позицию как это, если ((позиция + 1) % 4 == 0) {return 1;} –

0

вы можете переопределить getItemViewType и использовать другой ViewHolder для различной компоновки.

0

Вы должны переопределить getItemViewType так:

@Override 
    public int getItemViewType(int position) { 
     Add your condition and return viewType(Constant) 
    } 

Теперь Проверьте viewType и Retrun viewHolder соответственно.

@Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      if (viewType == VIEWHOLDER1) { 
       View v = LayoutInflater.from(activity).inflate(R.layout.layout1, parent, false); 
       return new ViewHolder1(v); 
      }else if(viewType == VIEWHOLDER2){ 
       View v = LayoutInflater.from(activity).inflate(R.layout.layout2, parent, false); 
       return new ViewHolder2(v); 
      } 
     } 

Теперь Проверьте, например, из viewHolder

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof ViewHolder1) { 
      Show values in UI accordingly. 
     }else if(holder instanceof ViewHolder2){ 
      Show values in UI accordingly. 
     } 
} 
+0

ohk ... getItemViewType (...) что именно мне нужно написать ...моя логика состоит в том, чтобы показать данные из разных макетов в 1-й и 6-й позициях – Sophie

+0

В вашем случае вернуть позицию из getItemViewType и в onCreateViewHolder проверить для viewType, используя переключатель if-else ИЛИ и соответственно вернуть ViewHolder. –

+0

Я пробовал, как вы упоминали меня, но я получаю проблемы/ошибки во многих местах своего класса адаптера, вы можете внести изменения в мой существующий класс адаптера ... какой я опубликовал выше – Sophie

0

Вы можете установить тип вы хотите в getItemViewType (целое положение) с макетом вы хотите. И onCreateViewHolder вы можете проверить viewType и раздуть строку соответственно.

here is an example.