我正在设计一款关于不同旅行方式的应用。所以我在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 ?
}
我希望我的数据按类别/部分排序,如下所示:
答案 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。使它如此简单。解决了我的问题。