Android RecyclerView 详解(二) 点击事件绑定、瀑布流和Grid的实现
先来一张本篇文章的实现效果吧(没有合并行)
有行合并的
一丶点击事件的绑定
我们参考listView的onItemClickListener
(1)返回值为void
(2)有四个参数值
a.adapter的view
b.view被点击的控件
c.position位置
d.数据模型对象(方便得到数据)
(3)创建一个接口
public interface onChildListener{
void onChildClick(RecyclerView parent, View view, int position, String data);
}
(4)写入属性中,并实现他的set方法
private onChildListener onChildListener;
public void setOnChildListener(MyAdapter.onChildListener onChildListener) {
this.onChildListener = onChildListener;
}
(5)如何得到parent属性
我们需要重写两个方法得到parent
/**
* 当连接到RecyclerView后,提供数据的时候调用这个方法
* @param recyclerView
*/
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView =recyclerView;
}
/**
* 解绑
* @param recyclerView
*/
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
recyclerView = null;
}
(6)将控件和点击事件进行绑定
a.实现VIew.OnClickListener
@Override
public void onClick(View view) {
int position = recyclerView.getChildAdapterPosition(view);
if (recyclerView!=null&&listener!=null&&!recyclerView.getItemAnimator().isRunning()) {
listener.onChildClick(recyclerView,view,position,list.get(position));
}
}
这里做一下说明,前两个参数判断你的父布局和你的点击接口是否不为空,那么最后一个判断的是你的删除或者是其他的动画是否在执行,我们需要在动画执行完之后才能实现他的点击事件,否则会出错。
b.控件调用点击方法
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);
view.setOnClickListener(this);
return new MyViewHolder(view);
}
(7)在你的需要的地方实现
@Override
public void onChildClick(RecyclerView parent, View view, int position, String data) {
Toast.makeText(this,"点击了第"+position+"个条目",Toast.LENGTH_SHORT).show();
}
(8)将实现的接口用adapter传递到MyAdapter中去
myRecyclerVIew.setAdapter(myAdapter);
至于如何实现条目内的点击直接下载源码就好在下部有链接~
二、设置LayoutManager
1.因为我们需要观察瀑布流布局所以将字段的长度进行更改方便观察
private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
if (i%3==0) {
list.add(String.format(Locale.CHINA,"第%03d条数据%s",i,"--------------"));
}else{
list.add(String.format(Locale.CHINA,"第%03d条数据",i));
}
}
}
2.为了方便更改我设置了三个按钮进行更改LayoutManager将在这三个按钮的点击事件中对其进行更改,并加上margin方便查看
(1)LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayout.VERTICAL,false);
myRecyclerVIew.setLayoutManager(linearLayoutManager);
他有三个参数(当前对象,纵向还是横向,是否翻转布局)
如果是所谓的翻转布局如果为true就是翻转布局那么整个RecyclerView将会翻转显示数据。
(2)GridLayoutManager
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
myRecyclerVIew.setLayoutManager(gridLayoutManager);
他有4个参数跟List不同的是他的第二个参数为多少行或者说是多少列。
(3)StaggeredGridLayoutManager(瀑布流布局)
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
myRecyclerVIew.setLayoutManager(staggeredGridLayoutManager);
两个参数(多少行或者列,纵向还是横向)
3.那么有时候你想要合并某些行和某些列的话如何操作呢?
//设置跨行或者跨列的数目
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position==0) {
return 3;
}else if(position==1){
return 2;
}
return 1;
}
});
这个返回的值就是你将占用多少的行或者列。
源码:源码链接