2015-12-24 6 views
14

Мне нужно добавить небольшую полосу между элементами RecyclerView. Эта полоса может появиться после различного количества элементов в списке. Это необходимо сделать динамически. Мне нужно реализовать что-то вроде того, что сделал FitBit: enter image description hereКак добавить динамический просмотр между элементами RecyclerView в android?

Мне также нужен первый ряд, то есть тот, который говорит «На этой неделе», чтобы придерживаться сверху, даже если страница прокручивается вниз.

+3

Вы должны использовать два вида вида. См. [Этот вопрос] (http: // stackoverflow.com/questions/26245139/how-to-create-recyclerview-with-multiple-view-type), чтобы увидеть, как его реализовать. Это может быть ключом к достижению того, чего вы хотите. – Fllo

+0

Да, я сделал это только сейчас. Но одна проблема все еще задерживается - как FitBit удается удерживать строку заголовка в верхней части экрана, даже если мы прокручиваем? – Sid

+4

Вы можете попробовать эту [библиотеку] (https://github.com/timehop/sticky-headers-recyclerview). Вы можете установить привычные макеты для элементов и заголовков, поэтому я думаю, что это то, что вы ищете – Cilenco

ответ

5

Вы должны использовать концепцию различных видов просмотра, используя getItemViewType(int). Затем на onCreateViewHolder(ViewGroup, int) вы можете проверить, какой тип вы должны раздувать/создавать.

Пример:

@Override 
public int getItemViewType(int position) { 
    // you should return the view type, based on your own dynamic logic 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     // handle each view type accordingly 
    } 
} 
+0

Можете ли вы предоставить ссылку или пример? – mrid

0

Вы можете использовать концепцию нескольких типов просмотра в вашем RecyclerView, Просто с помощью getItemViewType(), и заботиться о параметре viewType в onCreateViewHolder().

Например, вы можете использовать ниже модели:

public class Data{ 
      int field1; 
      float filed2; 
      int rowType // 1,2,2,...N this will fill by you whenever you will  
         //creating arraylist for your recyclerview 
    } 


    public class Custome Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    ArrayList<Data> mItems; 

    class ViewHolderRowType1 extends RecyclerView.ViewHolder { 
     ... 
    } 

    class ViewHolderRowType2 extends RecyclerView.ViewHolder { 
     ... 
    } 

    .... 
    class ViewHolderRowTypeN extends RecyclerView.ViewHolder { 
     ... 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return mItems.get(position).rowType; 
     //or 
     //return positon%2; // This will based on your condition   
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: return new ViewHolderRowType0(...); 
      case 1: return new ViewHolderRowType1(...); 
      ... 
      case N: return new ViewHolderRowTypeN(...); 
     } 
    } 

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

    //Just check which view type is going to bind and then fill the data accordingly in your rows 


     if(vh instanceof ViewHolderRowType1){ 
     // Fill the data for first view type 


     } else if (vh instanceof ViewHolderRowType2) { 
     // Fill the data for second view type 


     } else if (vh instanceof ViewHolderRowTypeN){ 
     // Fill the data for Nth view type 


     } 

    } 

Для вашего липким «С этой точки зрения слабого», вы можете добавить его в верхней части RecyclerView, а затем обработать его с помощью прокрутки Случая RecyclerView

0

Существует два способа реализовать такие RecyclerView

  1. Добавить заголовок в каждую макет и скрыть/показать на основе вашего требования (предпочтительно).
  2. Или используйте два разных макета для заголовка и содержимого (не предпочтительнее, поскольку это может вызвать проблему с общим количеством элементов в адаптере).

В пользовательском классе POJO/GetterSetter, добавьте одно поле для headerStatus (либо логического или INT), чтобы определить, нужно ли показывать заголовок или нет.

В настоящее время в переходнике адаптера public int getItemViewType(int position).

static final int TYPE_ITEM = 0; 
 
static final int TYPE_SEPARATOR = 1; 
 
@Override 
 
public int getItemViewType(int position) { 
 
\t if (mData.get(position).getHeaderStatus() == 0) 
 
\t \t return TYPE_ITEM; 
 
\t else 
 
\t \t return TYPE_SEPARATOR; 
 
}

Теперь во время накачивания макета в getView() вы можете проверить тип строки по

int rowType = getItemViewType(position);

Для случая 1, вы должны виден заголовок и установите в нем соответствующие данные. Для случая 2 вам нужно раздуть этот макет заголовка и добавить в него соответствующие данные.

0

Если вы хотите сделать это «правильный» путь, без взломов, вы должны написать свой собственный LayoutManager и обрабатывать эти случаи руками. Это не так сложно, как кажется, но приложит некоторые усилия.

+0

Можете ли вы указать любой пример layoutManager? –