RecyclerView使用案例三之实例

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的代码范例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值