2015-03-12 3 views
5

Я работал со списком в течение некоторого времени, и когда я начал их понимать, они выходят с recyclerview. У меня есть простой рабочий пример, содержащий все элементы. Я хотел бы создать разделы в recyclerview, используя тот же макет. Например, каждый раздел фильтруется данными (завтрак, обед, ужин). Как мне создать разделы в recyclerview? Если вам нужна дополнительная информация или я считаю, что это плохой вопрос, я обновлю свой вопрос или поставлю больше кода.Создание разделов в RecyclerView

Как бы фильтровать адаптеры от завтрака, обеда и ужина:

FoodAdapter mAdapterBreakfast = new FoodAdapter(LogSet.filterBy("Breakfast"), R.layout.row, this); 
FoodAdapter mAdapterLunch = new FoodAdapter(LogSet.filterBy("Lunch"), R.layout.row, this); 
FoodAdapter mAdapterDinner = new FoodAdapter(LogSet.filterBy("Dinner"), R.layout.row, this); 

Как получить все элементы в адаптере:

FoodAdapter mAdapter = new FoodAdapter(LogSet.all(), R.layout.row, this); 

Вот рабочий пример всего:

адаптер

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> { 
    private List<LogSet> meals; 
    private int rowLayout; 
    private Context mContext; 
    View v; 

    public FoodAdapter(List<LogSet> mMeals, int rowLayout, Context context) { 
     this.meals = mMeals; 
     this.rowLayout = rowLayout; 
     this.mContext = context; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int i) { 
     LogSet meal = meals.get(i); 
     viewHolder.countryName.setText(meal.getLiftName()); 
    } 

    @Override 
    public int getItemCount() { 
     return meals == null ? 0 : meals.size(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView countryName; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      countryName = (TextView) itemView.findViewById(R.id.foodName); 
     } 
    } 
} 

MainActivity

public class MainActivity extends ActionBarActivity { 
    RecyclerView mRecyclerView; 
    Date mDate = new Date(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_testing_rec); 
     mRecyclerView = (RecyclerView) findViewById(R.id.list); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
     FoodAdapter mAdapter = new FoodAdapter(LogSet.all(), R.layout.row, this); 
     mRecyclerView.setAdapter(mAdapter); 
     /* 
     FoodAdapter mAdapterBreakfast = new FoodAdapter(LogSet.filterBy("Breakfast"), R.layout.row, this); 
     FoodAdapter mAdapterLunch = new FoodAdapter(LogSet.filterBy("Lunch"), R.layout.row, this); 
     FoodAdapter mAdapterDinner = new FoodAdapter(LogSet.filterBy("Dinner"), R.layout.row, this); 
     */ 
    } 
} 

Вот как я бы отправить значение каждого списка к адаптеру:

адаптер

public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.ViewHolder> { 
    private List<LogSet> meals; 
    private List<LogSet> breakfast; 
    private List<LogSet> lunch; 
    private List<LogSet> dinner; 
    private int rowLayout; 
    private Context mContext; 
    View v; 

    public FoodAdapter(List<LogSet> mMeals, List<LogSet> mBreakfast, List<LogSet> mLunch, List<LogSet> mDinner, int rowLayout, Context context) { 
     this.meals = mMeals; 
     this.breakfast = mBreakfast; 
     this.lunch = mLunch; 
     this.dinner = mDinner; 
     this.rowLayout = rowLayout; 
     this.mContext = context; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     v = LayoutInflater.from(viewGroup.getContext()).inflate(rowLayout, viewGroup, false); 
     return new ViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int i) { 
     LogSet meal = meals.get(i); 
     viewHolder.countryName.setText(meal.getLiftName()); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView countryName; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      countryName = (TextView) itemView.findViewById(R.id.foodName); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return meals == null ? 0 : meals.size(); 
    } 
} 

MainActivity минус все()

public class MainActivity extends ActionBarActivity { 
    RecyclerView mRecyclerView; 
    Date mDate = new Date(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_testing_rec); 
     mRecyclerView = (RecyclerView) findViewById(R.id.list); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
     FoodAdapter mAdapter = new FoodAdapter(LogSet.all(), LogSet.filterBy("Breakfast"), LogSet.filterBy("Lunch"), LogSet.filterBy("Dinner"), R.layout.row, this); 
     mRecyclerView.setAdapter(mAdapter); 
     /* 
     FoodAdapter mAdapterBreakfast = new FoodAdapter(LogSet.filterBy("Breakfast"), R.layout.row, this); 
     FoodAdapter mAdapterLunch = new FoodAdapter(LogSet.filterBy("Lunch"), R.layout.row, this); 
     FoodAdapter mAdapterDinner = new FoodAdapter(LogSet.filterBy("Dinner"), R.layout.row, this); 
     */ 
    } 
} 

Опять же, как мне создать разделы в RecyclerView с завтраком, обедом и ужином?

+1

Вы можете используйте этот SimpleSectionedRecyclerViewAdapter оттуда: https://gist.github.com/gabrielemariotti/4c189fb1124df4556058 – anivaler

+0

Посмотрите на этот ответ: http://stackoverflow.com/a/34464367/2739684 –

ответ

2

Вы можете добиться этого только одним адаптером из этой библиотеки: SectionedRecyclerViewAdapter.

Сначала нужно создать класс Раздел группировать элементы:

class MySection extends StatelessSection { 

    String title; 
    List<LogSet> list; 

    public MySection(String title, List<LogSet> list) { 
     // call constructor with layout resources for this Section header, footer and items 
     super(R.layout.section_header, R.layout.section_item); 

     this.title = title; 
     this.list = list; 
    } 

    @Override 
    public int getContentItemsTotal() { 
     return list.size(); // number of items of this section 
    } 

    @Override 
    public RecyclerView.ViewHolder getItemViewHolder(View view) { 
     // return a custom instance of ViewHolder for the items of this section 
     return new MyItemViewHolder(view); 
    } 

    @Override 
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) { 
     MyItemViewHolder itemHolder = (MyItemViewHolder) holder; 

     // bind your view here 
     itemHolder.tvItem.setText(list.get(position).getLiftName()); 
    } 

    @Override 
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) { 
     return new SimpleHeaderViewHolder(view); 
    } 

    @Override 
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) { 
     MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder; 

     // bind your header view here 
     headerHolder.tvItem.setText(title); 
    } 
} 

Тогда вы создали RecyclerView с 3-мя экземплярами своего класса раздела (завтрак, обед и ужин):

// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter(); 

// Create your sections with the list of data 
MySection breakfastSection = new MySection("Breakfast", LogSet.filterBy("Breakfast")); 
MySection lunchSection = new MySection("Lunch", LogSet.filterBy("Lunch")); 
MySection dinnerSection = new MySection("Dinner", LogSet.filterBy("Dinner")); 

// Add your Sections to the adapter 
sectionAdapter.addSection(breakfastSection); 
sectionAdapter.addSection(lunchSection); 
sectionAdapter.addSection(dinnerSection); 

// Set up your RecyclerView with the SectionedRecyclerViewAdapter 
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
recyclerView.setAdapter(sectionAdapter);