Android recyclerView - 如何知道我在哪个部分?

时间:2016-10-03 22:16:46

标签: android android-recyclerview

我正在设计一款关于不同旅行方式的应用。所以我在android中有一个数据源,它有许多不同类别的业务列表。类别是汽车,自行车和飞机。因此,想象一下列表中有许多汽车,其次是许多自行车,其次是许多飞机。我想用recyclerView将它们分开。但我不知道如何创建部分/类别?

我有一个模型(数据源),我可以调用以获得这样的每个类别: model.getAirplanesList(); model.getCarsList(); model.getBikesList();

拥有3种不同型号会更好吗?所以我需要首先展示最终产品:

   1. list of airplanes   
   2. then a list of cars
   3. last a list of bikes

我需要它为每个部分都有标题。我怎么知道我在哪个部门?

3个类别将使用相同的布局文件,因此viewType可以保持相同我认为:

@Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.transports_list_row, parent, false);

        return new MyViewHolder(itemView);
    }

//我应该以某种方式使用viewType吗?

在onBindViewHolder中,我很困惑,我怎么知道我在哪个部分。到目前为止,我只在飞机上工作:

@Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Transport transport = model.get(position).getAirplanesList();
        holder.title.setText(transport.getTitle());
        holder.genre.setText(transport.getGenre());
        holder.year.setText(transport.getYear());

//what about Cars and bikes. how to know what section i am in ?
    }

我希望我的数据按类别/部分排序,如下所示:

enter image description here

4 个答案:

答案 0 :(得分:1)

您可以使用库SectionedRecyclerViewAdapter将数据分组到各个部分。

首先创建一个Section类:

class MySection extends StatelessSection {

    String title;
    List<Transport> list;

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

        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
        Transport transport = list.get(position);
        itemHolder.title.setText(transport.getTitle());
        itemHolder.genre.setText(transport.getGenre());
        itemHolder.year.setText(transport.getYear());
    }

    @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:

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

// Add your Sections to the adapter
sectionAdapter.addSection(new MySection("Airplanes", model.getAirplanesList()));
sectionAdapter.addSection(new MySection("Cars", model.getCarsList()));
sectionAdapter.addSection(new MySection("Bikes", model.getBikesList()));

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

答案 1 :(得分:0)

您处于正确的轨道,您可以利用getItemViewType()根据对象类型或约束来查找应在下一个方法中创建和填充ViewHolder的类型。这意味着您可以拥有单独的模型或只有一个模型并应用约束(请注意,这不应该是繁重的操作)以返回正确的视图类型。

通过约束简单检查类型:

@Override
public int getItemViewType(int position){
   TransporationModel transportation = mList.get(position);
   if(transporation.isBike()){ return VIEW_TYPE_BIKE;
   else if(transporation.isBus()){ return VIEW_TYPE_BUSE;
  //..etc

}

答案 2 :(得分:0)

它可能会对你有所帮助。 在适配器getView方法中这样做

  @Override
   public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        final Item i = items.get(position);
        if (i != null) {
            if (i.isSection()) {

                SectionItem si = (SectionItem) i;
                v = vi.inflate(R.layout.list_item_section, null);
                    v.setOnClickListener(null);
                v.setOnLongClickListener(null);
                v.setLongClickable(false);

                 TextView sectionView = (TextView) v
                        .findViewById(R.id.list_item_section_text);
                sectionView.setTextColor(Color.GRAY);
                sectionView.setText(si.getTitle());


            } else if (i.isItem()) {

                Exam exam = (Exam) i;
                 v = vi.inflate(R.layout.exampanel, null);

                TextView examtopic = (TextView) v.findViewById(R.id.topic_title);
                TextView examcontent = (TextView) v.findViewById(R.id.listcontent);
                TextView datetimetext = (TextView) v.findViewById(R.id.datetime);
                TextView colortext = (TextView) v.findViewById(R.id.color_text);                       

            }

        }
        return v;
    }

谢谢。

答案 3 :(得分:0)

我发现多个部分的最大图书馆是airbnb的EPOXY。使它如此简单。解决了我的问题。