现在的项目必不可少的就对数据填充适配,网上有很多的文章都有相关的介绍,我就不做详细的说明介绍了。
部分的方法的简单的说明
1、getItemViewType(int position)
这个方法就是,针对不同的item做不同的标识,然后根据根据这个标识来选择不同的布局
2、onCreateViewViewHolder(ViewGroup parent,int viewType)
这个方法就是根据view Type的来进行选择不同的ViewHolder,这个和getItemViewType(int position)方法是密切相关的
3、onBindViewHolder(ViewHolder viewHolder,int position)
这个方法是用来对数据进行绑定的
设置不同的ViewHolder
1、定义标识
根据项目的需要来定义你所需要的标识
private final int TYPE_ITEM=0;//用于设置要填充数据的标识
private final int TYPE_FOOT=1;//用于数据底部没有数据时要显示ViewHolder的标识
private final int TYPE_LOADING=2;//用于加载更多的数据
private final int TYPE_NODATA=3;//没有获取到数据要显示的View Holder的标识
2、定义不同的ViewHolder
针对于不同的填充数据,TYPE_ITEM可以定义不同的ViewHolder
class PersonViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tv_name)
TextView tv_name;
@BindView(R.id.item_evidence)
TextView tv_phone;
public EvidenceViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
对于其他的公共需要的就单独的定义
//加载数据 public static class LoadingViewHolder extends RecyclerView.ViewHolder { public LoadingViewHolder(View itemView) { super(itemView); } } //定义没有数据时要显示的 public static class NoDataViewHolder extends RecyclerView.ViewHolder{ public NoDataViewHolder(View itemView) { super(itemView); } } //定义底部没有更多数据的 public static class FooterViewHolder extends RecyclerView.ViewHolder { public FooterViewHolder(View itemView) { super(itemView); } } 下一步就是根据不同的标识创建不同ViewHolder
if (viewType == TYPE_ITEM) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_person, parent, false);
return new PersonViewHolder(view);
} else if (viewType == TYPE_FOOTER) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer, null);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
return new FooterViewHolder(view);
} else if (viewType == TYPE_LOADING) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.no_more_layout, null);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
return new LOADINGViewHolder(view);
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.no_data_layout, null);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new NoDataViewHolder(view);
}
现在我们需要的东西我们已经定义好了下一步就要判断什么时候设置什么标识下面定义几个函数
public void setNoData(boolean b) {
this.mNoData = b;
}
public void setLoading(boolean b) {
this.mLoading = b;
}
public void setFoot(boolean b){
this.mFoot=b;
}
这些设置根据请求然后来设置
然后,获取这些TYPE
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
if (this.mLoading) {
return TYPE_LOADING;
} else if (this.mFooter) {
return TYPE_FOOTER;
} else {
return TYPE_NODATA;
}
} else {
return TYPE_ITEM;
}
}
但是我们要注意一下getItemCount(),现在就不是但是的
lists.size()了,这里要注意
if (mFooter || mNomore || mNoData) {
return lists.size() + 1;
} else {
return lists.size();
}
剩下的就要在获取数据后处理了,什么时候设置什么就要看数据了!
适配器的封装思路及简单的代码上面已经写的比较清楚了,希望对用到的同学有一些帮助!谢谢大家,不喜勿喷!!!