0
RecyclerView提高了查找的列表元素,但我想这样做somethink这样的:多余的元素
正如你所看到的,我只是项目清单,但我想组一些项目并用标题标记它们。
页眉和项目名单属于不同类别(其内部都有其他数据)recyclerView
那么,如何添加两种不同的布局(使用不同的数据)?
RecyclerView提高了查找的列表元素,但我想这样做somethink这样的:多余的元素
正如你所看到的,我只是项目清单,但我想组一些项目并用标题标记它们。
页眉和项目名单属于不同类别(其内部都有其他数据)recyclerView
那么,如何添加两种不同的布局(使用不同的数据)?
需要两个不同的布局和两个不同势视图持有人,并在您的适配器,你做到以下几点:
1 - 需要时实施的getItemViewType()
方法和返回不同的视图类型(例如基于位置)。您可以定义常量像private static final int VIEW_HEADER = 1;
,使其更容易
2 - 在你onCreateViewHolder()
的基础上,viewType
参数,返回ViewHolder你需要
3 - 在你onBindViewHolder()
,请检查您ViewHolder
的getItemViewType()
,丢给正确的类型和实现结合
下面是一个例子:
public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final static int VIEW_HEADER = 0;
private final static int VIEW_ITEM = 1;
private Context context;
public HeaderAdapter(Context context) {
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == VIEW_HEADER) {
// Inflate header layout
view = LayoutInflater.from(context).inflate(R.layout.elem_header, parent, false);
return new HeaderHolder(view);
}
// Inflate item layout
view = LayoutInflater.from(context).inflate(R.layout.elem_item, parent, false);
return new ItemHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == VIEW_HEADER){
// Do some header stuff
HeaderHolder headerHolder = (HeaderHolder) holder;
return;
}
// Do some item stuff
ItemHolder itemHolder = (ItemHolder) holder;
}
@Override
public int getItemCount() {
// Do some crazy calcuation to return the number of items you will display (headers + items)
return 0;
}
@Override
public int getItemViewType(int position) {
// Return the type depending on your logic, could use a modulo or even check some list you've passed
return position == 0 ? VIEW_HEADER : VIEW_ITEM;
}
private class ItemHolder extends RecyclerView.ViewHolder {
ItemHolder(View itemView) {
super(itemView);
}
}
private class HeaderHolder extends RecyclerView.ViewHolder {
HeaderHolder(View itemView) {
super(itemView);
}
}
}