RecyclerView 使用总结(三):点击事件、GridView等、瀑布流、动态增删
来源:互联网 发布:数据体现不出邓肯作用 编辑:程序博客网 时间:2024/06/11 12:11
一、RecyclerView的点击事件
实现方法:在适配器Adapter中定义接口,接口中定义两个方法:一个点击事件、一个长按事件。然后在onBindViewHolder中调用,利用view.setOnClickListener()和view.setOnLongClickListener()方法实现。最后在Activity中给适配器设置监听接口的对象就ok了。代码如下,适配器:
监听接口
public interface OnRecyclerViewItemListener { public void onItemClickListener(View view,int position); public void onItemLongClickListener(View view, int position); } private OnRecyclerViewItemListener mOnRecyclerViewItemListener; public void setOnRecyclerViewItemListener(OnRecyclerViewItemListener listener){ mOnRecyclerViewItemListener = listener; }
点击事件:
private void itemOnClick(final RecyclerView.ViewHolder holder){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition(); mOnRecyclerViewItemListener.onItemClickListener(holder.itemView, pos); } }); }
长按事件:
private void itemOnLongClick(final RecyclerView.ViewHolder holder){ holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition(); mOnRecyclerViewItemListener.onItemLongClickListener(holder.itemView, pos); //返回true是为了防止触发onClick事件 return true; } }); }
在onBindViewHolder中调用:
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { holder).textView.setText(mDatas.get(position)); //getLayoutPosition()方法会准确的获取到item的位置id onItemSonViewClick(holder); if (mOnRecyclerViewItemListener != null){ itemOnClick(holder); itemOnLongClick(holder); } }
activity中的代码:
private void onRecyclerItemClickListener(){ mAdapter.setOnRecyclerViewItemListener(new RecyclerViewAdapter.OnRecyclerViewItemListener() { @Override public void onItemClickListener(View view, int position) { Toast.makeText(MainActivity.this,"onClick:"+position,Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClickListener(View view, int position) { Toast.makeText(MainActivity.this,"onLongClick:"+position,Toast.LENGTH_SHORT).show(); } }); }
到此,RecyclerView的点击事件实现了。
二、用RecyclerView实现GridView、横向GridView、横向ListView
注意:此时不要添加分割线了,即去掉recyclerView.addItemDecoration()方法,在子View的布局中的最外层的Layout中添加android:layout_margin=”3dp”来实现分割线。
实现这三个的思路是一样的,都是更改LayoutManger就可以完成了,一句代码的事。
①、GridView:
mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
②、横向GridView:
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL));
③、横向ListView:
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
三、瀑布流的实现
思路:相当在GridView中把Item的高度设置成不同的,即在适配器Adapter中添加一个高度的集合,在onBindViewHolder中设置itemView的高度即可。
适配器:
public class WaterFallAdapter extends RecyclerView.Adapter<WaterFallAdapter.WaterFallItemHolder> { private Context mContext; private LayoutInflater mInflater; public List<String> mDatas; private List<Integer> heights; public WaterFallAdapter(Context context, List<String> datas) { this.mContext = context; this.mDatas = datas; mInflater = LayoutInflater.from(mContext); heights = new ArrayList<>(); for (int i = 0;i<mDatas.size();i++){ heights.add((int)(100+Math.random()*300)); } } @Override public void onBindViewHolder(WaterFallAdapter.WaterFallItemHolder holder, final int position) { holder.textView.setText(mDatas.get(position)); ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); lp.height = heights.get(position); holder.itemView.setLayoutParams(lp); } @Override public WaterFallAdapter.WaterFallItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.waterfall_item, parent, false); WaterFallItemHolder mItemViewHolder = new WaterFallItemHolder(view); return mItemViewHolder; } @Override public int getItemCount() { return mDatas.size(); } class WaterFallItemHolder extends RecyclerView.ViewHolder { protected TextView textView; public WaterFallItemHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.text_view); } }}
WaterfallActivity.java:
public class WaterFallActivity extends Activity { private RecyclerView recyclerView; private List<String> datas; private WaterFallAdapter waterFallAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.water_fall); initDatas(); initView(); } private void initDatas(){ datas = new ArrayList<>(); for (int i = 'A';i<'z';i++){ datas.add(""+(char)i); } } private void initView(){ recyclerView = (RecyclerView) findViewById(R.id.waterfall_recycler_view); recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)); waterFallAdapter = new WaterFallAdapter(this,datas); recyclerView.setAdapter(waterFallAdapter); }}
至此,瀑布流实现了。
四、RecyclerView中item的增加、移除动画
①、设置动画属性:recyclerView.setItemAnimator(new DefaultItemAnimator());
DefaultItemAnimator是自带的一个动画效果,在github上有其他的动画效果:https://github.com/gabrielemariotti/RecyclerViewItemAnimators
使用方法看一下github就知道了。
②、在适配器Adapter中定义 增加、移除两个方法:
public void insertData(String data,int position){ mDatas.add(position,data); //注意这里一定是用notifyItemInserted()方法来更新,如果用notifyDataSetChanged()的话,就没有动画效果了。 notifyItemInserted(position); }
public void removeData(int position){ mDatas.remove(position); //注意这里一定是用notifyItemRemoved()方法来更新,如果用notifyDataSetChanged()的话,就没有动画效果了。 notifyItemRemoved(position); }
注意:此时处理点击事件时,一定要用holder.getLayoutPosition()来获取位置id,且要放在点击事件接口的方法中。
然后在Activity中调用这两个方法就ok了。
代码下载请点我
- RecyclerView 使用总结(三):点击事件、GridView等、瀑布流、动态增删
- 一个RecyclerView搞定Listview、Gridview、瀑布流等
- 精通RecyclerView:打造ListView、GridView、瀑布流;学会添加分割线、 添加删除动画 、Item点击事件
- RecyclerView的使用(三)——点击事件
- Android RecyclerView 详解(二) 点击事件绑定、瀑布流和Grid的实现
- RecyclerView的横向布局及点击事件(也可做瀑布流效果)
- RecyclerView的基本用法 (一个控件实现ListView, GridView等效果)+接口回调点击事件
- RecyclerView 实现瀑布流及点击事件,含点击回调的接口
- RecyclerView之瀑布流(三)
- RecyclerView--实现 ListView,GridView,瀑布流 效果
- RecyclerView代替Listview Gridview 瀑布流
- RecyclerView实现ListView、GridView、瀑布流
- RecyclerView Demo,瀑布流视频列表GridView
- RecyclerView的使用(包含点击事件)
- RecyclerView Item点击事件实现 类似GridView
- RecyclerView实现瀑布流,快速滑动,侧滑删除,点击图片放大等效果
- android中RecyclerView的简单使用(三)——瀑布流
- Android RecyclerView的使用(三)——瀑布流的实现
- Android笔记(一)R文件无法生成
- 使用Zxing来实现二维码扫描
- Codeforces #341 div 2 E. Wet Shark and Blocks(矩阵快速幂)
- 编写JavaScript函数解析查询字符串
- 连续邮资问题(回溯+动态规划)
- RecyclerView 使用总结(三):点击事件、GridView等、瀑布流、动态增删
- vim使用
- 在xcode中修改整个项目名
- nodejs npm常用命令
- iOS 获取对象的全部属性、把model的所有属性和对应的值转化为字典
- python装饰器的学习笔记二
- iOS之HTTP网络编程
- Openfire集群部署不完全手册
- 查找類別所在包的方式