2016-02-26 4 views
-1

У меня есть требование, когда у меня есть один вид ресайклера, который должен поддерживаться несколькими классами моделей. Мой просмотр в переработчике раздувает несколько разных макетов. Таким образом, чтобы раздуть макет я определил мой onCreateViewholder, как показано ниже:Recycler View, поддерживающий несколько классов pojo

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

     RecyclerView.ViewHolder viewHolder = null; 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

     switch (viewType) { 
      case 1: 
       View v1 = inflater.inflate(R.layout.searchresultsrow1, parent, false); 
       viewHolder = new AppViewHolder(v1); 
       break; 
      case 2: 
       View v2 = inflater.inflate(R.layout.searchresultsrow2, parent, false); 
       viewHolder = new AppViewHolder(v2); 
       break; 
     return viewHolder 
} 

О методе BindView я использую экземпляр для определения типа держателя: `

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
     if(holder instanceof AppViewHolder){ 
      AppViewHolder vh1 = (AppViewHolder) holder; 
vh1.appName.setText(Html.fromHtml(**appList**.get(position).getmAppName()); 
} 
} else if (holder instanceof ContactViewHolder){ 
ContactViewHolder vh3 = (ContactViewHolder) holder; vh3.contactName.setText(Html.fromHtml(**contactList**.get(position).getContactName()));} 
}` 

Теперь я невежественный, что отправить на ITEMCOUNT:

@Override 
    public int getItemCount() { 
     return ??; 
    } 

Поскольку мой applist тип объект отличается и контакт Тип объекта списка отличается. Я попытался с корпусом switch в getItemCount, но затем он возвращает только количество отдельных списков и отображает результаты только для конкретного списка, тогда как мне нужны результаты, объединенные как из списка. Если я отправлю добавление обоих списков, то я встречу arrayindexoutofbounds исключение. Какой подход может быть использован в этом случае?

ответ

0

я хочу результаты совмещено как в списке:

Так как вы хотите, чтобы оба списка в результате recyclerView, создать список объектов типа и добавьте все содержимое обоих списков в этот список. Затем в onBindViewHolder() проверьте на list.get(position) instanceOf YourClass, затем выполните операцию, основанную на типе.

В getItemCount() вернуть размер комбинированного списка.

Надеюсь, это поможет.

0

Вы можете сделать что-то вроде этого

@Override 
public int getItemCount() { 
    if(appList != null && contactList != null) 
     return appList.size() + contactList.size(); 
    else 
    { 
     if(appList != null) 
      return appList.size(); 
     else if (contactList != null) 
      return contactList.size(); 
     else 
      return 0; 
    } 
} 

Внимание: Вы должны будете следить за количеством отрисовки элементов из каждого списка и использовать этот индекс, чтобы получить элемент из соответствующего списка, в противном случае вы будете получите ArrayIndexOutOfBoundsExcetption. Не используйте текущую позицию, чтобы получить элемент из списка.

Update

Держите две переменные

private int appListIndex = 0; 
Private int contactListIndex = 0; 

на уровне класса.

Тогда сделайте это

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    if(holder instanceof AppViewHolder){ 
     AppViewHolder vh1 = (AppViewHolder) holder; 
     vh1.appName.setText(Html.fromHtml(appList.get(appListIndex++).getmAppName()); 
    } 
    } else if (holder instanceof ContactViewHolder){ 
     ContactViewHolder vh3 = (ContactViewHolder) holder;  
     vh3.contactName.setText(Html.fromHtml(contactList.get(contactListIndex++).getContactName())); 
    } 
} 
+0

Я уже сделал это, но мое требование заключается в отображении комбинированных результатов. Если я использую if else, то он покажет только результаты списка одиночных массивов – Gautam

+0

@Gautam Обновлен мой ответ. – Rohit5k2

+0

В этом случае, предположим, что список содержит 5 элементов, тогда он вернет 10, и это вызовет arrayindexoutofbounds в onBindView. Поскольку положение может меняться, и оно может быть больше 5, которое я не найду внутри какого-либо из моих арраистов. – Gautam