RecylerView的复杂使用

RecylerView是类似于ListView、GridView的控件,但是它标准化了ViewHolder,而且比ListView、GridView这些控件更加灵活,并且还能够实现他们不能实现的功能,在布局管理器中可以设置多种格式:1、LinearLayoutManager可以使内容线性排列,横向或纵向,下一个参数是布尔类型的参数。2、GridLayoutManager 是网格式布局管理,第二个参数是int类型的数字,你想让布局显示几列就可以设置成为几,第三个参数可以设置横纵向,第四个参数是布尔类型的参数。3、StaggeredGridLayoutManager 是上面那两个控件不能实现的功能,
他是瀑布流,其参数和网格式布局的参数一样,但显示的效果不一样。但是下面这些涉及到一些其他的内容,ListView多条目展示,还有设置标头。

在MainActivity中

public class MainActivity extends AppCompatActivity {
    RecyclerView rv;
    List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到RecylerView的控件
        rv = (RecyclerView) findViewById(R.id.rv);
        //初始化数据
        initrv();
    }

    public void initrv() {
        initdata();
        //线性布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(this);
        //关联管理器
        rv.setLayoutManager(manager);
        //创建RecylerVewde的适配器
        MyRVAdapter adapter = new MyRVAdapter();
        //实例化一个TextView
        TextView tv1=new TextView(this);
        //在TextView里设置标题的内容
        tv1.setText("标题1");
        TextView tv2=new TextView(this);
        tv2.setText("标题2");
        //在适配器中加入标题
        adapter.addheader(tv1);
        adapter.addheader(tv2);
        //关联适配器
        rv.setAdapter(adapter);
    }
    //初始化条目的数据
    private void initdata() {
    //实例化字符串集合
        list = new ArrayList<String>();
        //for循环添加数据
        for (int i =0; i <100; i++) {
            list.add("Position" + i);
        }
    }
    //创建适配器的类并继承RecylerView的Adapter
    class MyRVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    //设置标头以及多条目的类型
        public static final int TYPE_HEADER=0;
        public static final int TYPE_ONE=1;
        public static final int TYPE_TWO=2;
        List<View> listheader=new ArrayList<View>();
        //添加标头的方法
        public void addheader(View view){
            listheader.add(view);
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //if else判断类型若如果是标头则添加标头的布局,如果是TYPE_ONE则添加第一个布局,TYPE_TWO则添加第二个布局。
            if(viewType==TYPE_HEADER){
                View view3 = View.inflate(MainActivity.this, R.layout.rv_header, null);
                MyHeaderHolder holderh = new MyHeaderHolder(view3);
                return holderh;
            }else if (viewType == TYPE_ONE) {
                View view = View.inflate(MainActivity.this, R.layout.rv_item, null);
                MyViewHolder1 holder1 = new MyViewHolder1(view);
                return holder1;
            } else{
                View view2 = View.inflate(MainActivity.this, R.layout.rv_item2, null);
                MyViewHolder2 holder2 = new MyViewHolder2(view2);
                return holder2;
            }
        }
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//如果子布局的数量为0的话先移除视图再添加视图则能使两个标题顺序不再变化
            if (holder instanceof MyHeaderHolder){
                if(((MyHeaderHolder)holder).ll.getChildCount()==0){
                    ((MyHeaderHolder)holder).ll.removeView(listheader.get(position));
                    ((MyHeaderHolder)holder).ll.addView(listheader.get(position));
                }
            }
           //给holder的TextView添加文字
            if(holder instanceof MyViewHolder1){
                ((MyViewHolder1) holder).tv.setText(list.get(position));
            }
            if(holder instanceof MyViewHolder2){
                ((MyViewHolder2) holder).tv2.setText(list.get(position));
            }
        }
//如果List为空则返回零,否则返回集合的长度
        @Override
        public int getItemCount() {
            return list==null?0:list.size();
        }
//得到条目视图的类型
        @Override
        public int getItemViewType(int position) {
        //如果position小于标头集合的长度则返回标头,如果position比5余0的话则返回TYPE_ONE否则返回TYPE_TWO
            if(position < listheader.size()){
                return TYPE_HEADER;
            }else if(position%5==0){
                return TYPE_TWO;
            }else {
                return TYPE_ONE;
            }
        }
//下面是各个holder类均继承RecylerView的ViewHolder在他们各自的布局中找到他们的控件
        class MyViewHolder1 extends RecyclerView.ViewHolder{
            TextView tv;
            public MyViewHolder1(View itemView) {
                super(itemView);
            tv=itemView.findViewById(R.id.tv);
            }
        }
        class MyHeaderHolder extends RecyclerView.ViewHolder{
            LinearLayout ll;
            public MyHeaderHolder(View itemView) {
                super(itemView);
                ll=itemView.findViewById(R.id.ll);
            }
        }
        class MyViewHolder2 extends RecyclerView.ViewHolder{
            TextView tv2;
            ImageView iv;
            public MyViewHolder2(View itemView) {
                super(itemView);
                tv2=itemView.findViewById(R.id.tv2);
                iv=itemView.findViewById(R.id.iv);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值