RecyclerView使用
相信看过RecyclerView使用案例二的都知道使用RecyclerView时必须先联动它的布局管理器,再使用adapter来绑定数据源。
先上多布局的效果图:
在MainActivity中:
//初始化数据源
List<News> newses=new ArrayList<News>();
newses.add(new News(1,"qq"));
newses.add(new News(3,"qq"));
newses.add(new News(1,"qq"));
newses.add(new News(2,"qq"));
newses.add(new News(2,"qq"));
newses.add(new News(2,"qq"));
newses.add(new News(1,"qq"));
newses.add(new News(2,"qq"));
newses.add(new News(2,"qq"));
newses.add(new News(2,"qq"));
RecyclerView recyclerview= (RecyclerView) findViewById(R.id.cable_recyclerview);
//联动布局管理器
recyclerview.setLayoutManager(new LinearLayoutManager(this));
//绑定适配器
recyclerview.setAdapter(new NewsAdapter(MainActivity.this,newses));
//自定义的数据bean对象(实际运用中改为你后台请求到的JsonBean)
public class News {
public News(int kind, String string) {
this.kind = kind;
this.string = string;
}
private int kind;
private String string;
public int getKind() {
return kind;
}
public void setKind(int kind) {
this.kind = kind;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}
//注意:此处是对多布局的处理方式,所以此处传递过去的数据源一定要是包括所有数据的数据源集合。
再做完这步,我们需要做的是自定义RecyclerView,即NewsAdapter。
具体步骤:
一:NewsAdapter的构造方法的参数传递
二:getItemViewType()方法中判断多布局的何时调用
三:onCreateViewHolder()方法中引入布局
四:onBindViewHolder()方法中创建多ViewHolder来初始化控件和绑定对应布局的数据源并展示在布局控件中
五:getItemCount()方法中确定有几种布局用于展示(一般直接写传递过来的数据源的size)
六:各类不同布局创建的ViewHolder的初始化
多布局的布局很简单,此处就省略了,我们直接代码展示
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int TITLE_VIEW = 1; //布局的头
private final int CONTENT_VIEW = 2; //布局的子内容项
private final int EMPTY_VIEW = 3;
private Context context;
private List<News> list;
public NewsAdapter(Context context, List<News> list) {
this.context = context;
this.list = list;
}
//多布局的管理
@Override
public int getItemViewType(int position) {
if(list.get(position).getKind() == 1){
return TITLE_VIEW;
} else if(list.get(position).getKind() == 2){
return CONTENT_VIEW;
} else {
return super.getItemViewType(position);
}
}
//引入多布局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if(viewType == TITLE_VIEW){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.total, parent, false);
return new TitleViewHolder(view);
} else if(viewType == CONTENT_VIEW){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1, parent, false);
return new ContentViewHolder(view);
} else{
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2, parent, false);
return new EmptyViewHolder(view);
}
}
//多布局内容的初始化和数据绑定
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof EmptyViewHolder){
EmptyViewHolder viewHolder = (EmptyViewHolder)holder;
viewHolder.im1.setImageResource(R.drawable.background2);
viewHolder.im2.setImageResource(R.drawable.background2);
viewHolder.im3.setImageResource(R.drawable.background2);
} else if(holder instanceof ContentViewHolder){
ContentViewHolder viewHolder = (ContentViewHolder)holder;
viewHolder.bt1.setText(list.get(position).getString());
viewHolder.bt2.setText(list.get(position).getString());
viewHolder.bt3.setText(list.get(position).getString());
} else if(holder instanceof TitleViewHolder){
TitleViewHolder viewHolder = (TitleViewHolder)holder;
viewHolder.tv1.setText("标题");
}
}
//总共有多少种布局
@Override
public int getItemCount() {
return list.size();
}
class TitleViewHolder extends RecyclerView.ViewHolder{
public final TextView tv1;
public TitleViewHolder(View itemView) {
super(itemView);
tv1 = (TextView) itemView.findViewById(R.id.tv1);
}
}
class ContentViewHolder extends RecyclerView.ViewHolder{
public final Button bt1,bt2,bt3;
public ContentViewHolder(View itemView) {
super(itemView);
bt1 = (Button) itemView.findViewById(R.id.bt1);
bt2 = (Button) itemView.findViewById(R.id.bt2);
bt3 = (Button) itemView.findViewById(R.id.bt3);
}
}
class EmptyViewHolder extends RecyclerView.ViewHolder{
public final ImageView im1,im2,im3;
public EmptyViewHolder(View itemView) {
super(itemView);
im1 = (ImageView) itemView.findViewById(R.id.im1);
im2 = (ImageView) itemView.findViewById(R.id.im2);
im3 = (ImageView) itemView.findViewById(R.id.im3);
}
}
}
Ok,这样RecyclerView的多Item布局的加载就实现,本篇DEMO的源代码
多布局RecyclerView的代码范例