RecyclerView是对ListView的封装,所以ListView上能用的方法对RecyclerView同样适用,并且会更简单
在实际开发中,我们可能需要一个列表,显示多种布局,getItemViewType()方法完美解决了这个问题,在BaseAdapter中还有getViewTypeCount()这个方法。这里我们使用RecyclerView.Adapter。只用getItemViewType就可以了。
先来看这个方法
@Override
public int getItemViewType(int position) {
}
参数position代表RecyclerView的位置,而int型的返回值代表了布局的类型,我们可以用0,1,2…..来表示判断,例如:
@Override
public int getItemViewType(int position) {
if (position == 0){
return 0;
} else if (position == 1){
return 1;
} else {
return 2;
}
}
我们需要在
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
}
方法中判断view的类型。该方法的第二个参数viewType就是getItemViewType返回值的类型,通过判断值0,1,2…..来根据不同类型加载显示不同的布局,例如
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
ViewHolder holder = null;
switch (viewType){
case 0:
view = LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_1, parent, false);
holder = new ViewHolderOne(view);
break;
case 1:
view = LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_2, parent, false);
holder = new ViewHolderTwo(view);
break;
case 2:
view = LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_2, parent, false);
holder = new ViewHolderThree(view);
break;
}
return holder;
}
最后在
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)){
case 0:
final ViewHolderOne holderOne = (ViewHolderOne) holder;
holderOne.text1.setText(beans.get(position).getTxt());
break;
case 1:
ViewHolderTwo holderTwo = (ViewHolderTwo) holder;
holderTwo.text1.setText(beans.get(position).getTxt());
holderTwo.text2.setText(beans.get(position).getTxt());
break;
case 2:
ViewHolderThree holderTwo = (ViewHolderTwo) holder;
holderThree.text1.setText(beans.get(position).getTxt());
holderThree.text2.setText(beans.get(position).getTxt());
break;
}
}
在这里,我们要定义3个ViewHolder,我们的Adapter继承RecyclerView.Adapter就可以,以上就是列表显示多种布局的处理,灵活运用,举一反三。比如百度贴吧子评论的显示更多,就可以这样处理,通过控制getItemCount和getItemViewType来实现。
点击下载仿百度贴吧子评论加载更多