CoX*_*ier 9 android android-layout android-view android-viewholder android-recyclerview
如您所知,如果我们想要实现多种类型RecyclerView
,我们应该提供多种CustomViewHolder
扩展RecyclerView.ViewHolder
.
对于exmpale,
class TextViewHolder extends RecyclerView.ViewHolder{
TextView textView;
}
class ImageViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
}
Run Code Online (Sandbox Code Playgroud)
然后我们必须覆盖getItemViewType
.并onCreateViewHolder
进入构造TextViewHolder
或ImageViewHolder
.
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
} else {
return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是正常的,但还有另一种方式.
我想只有一个CustomViewHolder
就足够了.
class MultipleViewHolder extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
MultipleViewHolder(View itemView, int type){
if(type == 0){
textView = (TextView)itemView.findViewById(xx);
}else{
imageView = (ImageView)itemView.findViewById(xx);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您在开发工作中使用哪种方式?
azi*_*ian 28
就个人而言,我喜欢Yigit Boyar在本次演讲中提出的方法(快进到31:07).而不是返回的常量INT从getItemViewType()
,直接返回布局ID,这也是一个int,并保证是唯一的:
@Override
public int getItemViewType(int position) {
switch (position) {
case 0:
return R.layout.first;
case 1:
return R.layout.second;
default:
return R.layout.third;
}
}
这将允许您在以下方面实施以下内容onCreateViewHolder()
:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(viewType, parent, false);
MyViewHolder holder = null;
switch (viewType) {
case R.layout.first:
holder = new FirstViewHolder(view);
break;
case R.layout.second:
holder = new SecondViewHolder(view);
break;
case R.layout.third:
holder = new ThirdViewHolder(view);
break;
}
return holder;
}
MyViewHolder
抽象类在哪里:
public static abstract class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemView) {
super(itemView);
// perform action specific to all viewholders, e.g.
// ButterKnife.bind(this, itemView);
}
abstract void bind(Item item);
}
并FirstViewHolder
遵循:
public static class FirstViewHolder extends MyViewHolder {
@BindView
TextView title;
public FirstViewHolder(View itemView) {
super(itemView);
}
@Override
void bind(Item item) {
title.setText(item.getTitle());
}
}
这将onBindViewHolder()
成为一个单行:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.bind(dataList.get(holder.getAdapterPosition()));
}
因此,您将每个人ViewHolder
分开,哪里bind(Item)
将负责执行特定于此的操作ViewHolder
.
归档时间: |
|
查看次数: |
6263 次 |
最近记录: |