现在,我们用RecyclerView来实现瀑布流的效果,我们来看一下效果图:
根据之前对RecyclerView的了解,我们要实现这个效果,我的大体思路是:在onCreate()方法里,通过设置LayoutManager来设置瀑布流的布局和增加、删除的样式;在adapter里可以设置数据的不同高度;RecyclerView没有监听事件,我们需要自己来定义接口,实现它的点击事件。下面,我们一步步来实现。
一、我们来实现瀑布流的样式,在onCreate()方法里来设置
//设置recycleView的straggerdV的布局管理样式
StaggeredGridLayoutManager staggeredGrid = new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGrid);
//设置recycleView的增加样式
recyclerView.setItemAnimator(new DefaultItemAnimator());
二、实现增加、删除的效果
//点击删除按钮,固定的删除位置为1的item
public void deleteItem(View view) {
mData.remove(1);
//这里需要注意一下,我们调用的是notifyItemRemoved()方法
straggerAdater.notifyItemRemoved(1);
}
//点击增加按钮
public void addItem(View view) {
mData.add(1, "insert one");
straggerAdater.notifyItemInserted(1);
}
三、在adapter里,设置不同的数据高度
private List<Integer> mHeights;
public StraggerAdater(List<String> mData, Context mcontext) {
this.mData = mData;
this.mcontext = mcontext;
mInflater = LayoutInflater.from(mcontext);
mHeights = new ArrayList<>();
for (int i = 0; i < mData.size(); i++) {
mHeights.add((int) (100 + Math.random() * 300));
}
}
@Override
public void onBindViewHolder(final MyViewHolder myViewHolder, final int i) {
//给每一项设置高度
ViewGroup.LayoutParams lp = myViewHolder.itemView.getLayoutParams();
lp.height = mHeights.get(i);
myViewHolder.itemView.setLayoutParams(lp);
myViewHolder.textView.setText(mData.get(i));
}
写完上面这些代码,我们可以实现瀑布流的布局和增加、删除的动画效果了。
四、我们来实现Item的监听事件
//首先,完善我们的adapter
//我们定义一个接口,接口里有长点击和短点击的不同方法
public interface onItemClickListener {
public void setOnItemClick(View view, int pos);
public void setOnLongItemClick(View view, int pos);
}
//声明一个监听者、提供一个监听方法
private onItemClickListener listener;
public void setOnItemClickListener(onItemClickListener listener) {
this.listener = listener;
}
//在onBindViewHolder()方法里实现接口方法
@Override
public void onBindViewHolder(final MyViewHolder myViewHolder, final int i) {
//给每一项设置高度
ViewGroup.LayoutParams lp = myViewHolder.itemView.getLayoutParams();
lp.height = mHeights.get(i);
myViewHolder.itemView.setLayoutParams(lp);
myViewHolder.textView.setText(mData.get(i));
if (listener != null) {
//短点击
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//从holder里取出position
int layoutPos = myViewHolder.getPosition();
listener.setOnItemClick(myViewHolder.itemView, layoutPos);
}
});
//长点击
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int layoutPos = myViewHolder.getPosition();
listener.setOnLongItemClick(myViewHolder.itemView, layoutPos);
return false;
}
});
}
}
在主activity里adapter实现监听
straggerAdater.setOnItemClickListener(new StraggerAdater.onItemClickListener() {
@Override
public void setOnItemClick(View view, int pos) {
Toast.makeText(StraggerViewActivity.this, "click : " + pos, Toast.LENGTH_SHORT).show();
}
@Override
public void setOnLongItemClick(View view, int pos) {
Toast.makeText(StraggerViewActivity.this, "longClick : " + pos, Toast.LENGTH_SHORT).show();
}
});
这样,我们就自己实现了点击事件。