android的RecycleView的基本使用和item间隔问题

昨天使用了RecycleView + CardView的组合进行列表的设计


却花了一个晚上的时间来调试,RecyclView实现需要:


1.封装一个自定义的Item数据类


2.需要用ArrayList去把那个数据类封装起来,其实不用封装也可以,但网上看到的大部分Demo都是有进行封装的,这样有利于数据的处理。


3.重写Adapter,RecycleView.Adapter是一个抽象类,因为你在实际使用时肯定是要自定义Adapter的数据的,所以官方设为一个抽象类让你自己进行重写。

    重写Adapter还有一个注意事项是要重写ViewHolder,ViewHolder相当于一个Item,通过重写这个ViewHolder把每个Item里面的控件进行绑定,方便下面的设置资源。


4.重写Adapter还需要重写onCreateViewHolder,onBindViewHolder,getItemCount这三个函数,

    第一个函数是用

View v = View.inflate(parent.getContext(),R.layout.plan_cardview_layout,null);

   来设置ViewHolder的布局


    第二个函数是用来设置ViewHolder中的数据源


    第三个函数是用来获取Item的个数,昨天晚上我就是在写这个函数时不小心将返回值设为了0,导致无论怎么弄RecycleView中都没有出现item。


然后就是在对应的Activity或者Fragment中设置RecycleView


recyclerView = (RecyclerView)view.findViewById(R.id.plan_list);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity().getResources().getDrawable(R.drawable.tab_line),false,false));
        recyclerView.setLayoutManager(layoutManager);
        adapter = new MyAdapter(data);
        recyclerView.setAdapter(adapter);


这里面出现了一个LayoutManager 这个东西是用来管理RecycleView的布局的,可我看了半天api都没有找到我要的设置Item之间距离的函数。


可疑的反倒是这个ItemDecoration这个好像就是来设置各个Item样式的东西了。


然后就求助了一下万能的谷歌


这是一个git的地址,GIT里面写的很简单,确实封装好的用法也是很简单,这个的效果是再两个item之间添加一个间隔的图片。

点击打开链接


这并不是我的目标,所以我继续寻找

底下这个也是利用ItemDecoration实现的透明间隔的RecycleView

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpacesItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;

        // Add top margin only for the first item to avoid double space between items
        if(parent.getChildPosition(view) == 0)
            outRect.top = space;
    }
}

发现一个有间隔item实现其拉斯就是这么简单。不得不感叹google大发好!

不过这个ItemDecoration有一个使用上的问题,

就是我发现他是伴随着item的添加而创建的,我这边的测试结果是5个item他输出了5次结果。

所以使用parent.getChildCount()的话会有5次输出1 2 3 4 5 这样子

并且因为Recycle的关系,还会重复创建。


解决方法就是:


不用代码里面的bottom的傻办法。。既然最后一个不好获得,第一还不好得?

public class SpaceItemDecoration extends RecyclerView.ItemDecoration{

        private int space;

        public SpaceItemDecoration(int space) {
            this.space = space;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

            //设置左右的间隔如果想设置的话自行设置,我这用不到就注释掉了
/*          outRect.left = space;
            outRect.right = space;*/

    //       System.out.println("position"+parent.getChildPosition(view));
    //       System.out.println("count"+parent.getChildCount());

   //         if(parent.getChildPosition(view) != parent.getChildCount() - 1)
   //         outRect.bottom = space;

            //改成使用上面的间隔来设置
            if(parent.getChildPosition(view) != 0)
                outRect.top = space;
        }
    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值