昨天使用了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;
}
}