前言:RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。
本文目的:通过简单的例子,讲解RecyclerView的使用、自定义RecyclerView子项的点击事件以及长按事件
本文Demo下载地址:https://github.com/ShaoWangYun/SlideViewDemo
最终效果图:
一、布局文件:
1.activity_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:padding="15dp" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".recyclerview.RecyclerViewActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </RelativeLayout>2.recycler_item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="15dp" android:id="@+id/recycler_item" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/image" android:src="@mipmap/ic_launcher_round" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/text_recycler" android:layout_centerVertical="true" android:layout_toRightOf="@+id/image" android:layout_marginLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>二、数据实体类
public class RecyclerDataBean { private String Index; public String getIndex () { return Index; } public void setIndex (String index) { Index = index; } public RecyclerDataBean (String index) { Index = index; } public RecyclerDataBean () { } @Override public String toString () { return "RecyclerDataBean{" + "Index='" + Index + '\'' + '}'; } }三、适配器
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder>{ public List<RecyclerDataBean> recyclerDataBeans = new ArrayList<>(); private OnItemClickListener onItemClickListener; private OnItemLongClickListener onItemLongClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { this.onItemLongClickListener = onItemLongClickListener; } public interface OnItemClickListener{ void onItemClick (View view, int position); } public interface OnItemLongClickListener{ void onItemLongClick (View view, int position); } public RecyclerAdapter (List<RecyclerDataBean> recyclerDataBeans) { this.recyclerDataBeans = recyclerDataBeans; } //创建新View,被LayoutManager所调用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_item,viewGroup,false); ViewHolder vh = new ViewHolder(view); return vh; } //将数据与界面进行绑定的操作 @Override public void onBindViewHolder(final ViewHolder viewHolder, final int position) { viewHolder.Index.setText("序号:"+recyclerDataBeans.get(position).getIndex()); if(onItemClickListener!=null){ viewHolder.Recycler_item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(viewHolder.itemView,position); } }); viewHolder.Recycler_item.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onItemLongClickListener.onItemLongClick(viewHolder.itemView,position); return false; } }); } } //获取数据的数量 @Override public int getItemCount() { return recyclerDataBeans.size(); } public RecyclerDataBean getItem(int index) { return recyclerDataBeans.get(index); } //自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView Index; private RelativeLayout Recycler_item; public ViewHolder(View view){ super(view); Index = view.findViewById(R.id.text_recycler); Recycler_item = view.findViewById(R.id.recycler_item); } } }注:RecyclerView的适配器相对于ListView和GridView是较复杂的,复杂之处在于,RecyclerView给了开发者充分的扩展性,所以对于子项的一些事件比如说OnItemClick、OnItemLongClick等回调方法,需要自己重新定义,此外为了在滑动的时候不必每次都重新创建对象从而提升整体性能,定义使用ViewHolder也是一个常用的解决方案。
四、主界面
public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView recycler_view; private RecyclerView.LayoutManager mLayoutManager; private List<RecyclerDataBean> recyclerDataBeans = new ArrayList<>(); private RecyclerAdapter recyclerAdapter; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); initView(); } private void initView(){ recycler_view = findViewById(R.id.recycler_view); //创建默认的线性LayoutManager mLayoutManager = new LinearLayoutManager(this); recycler_view.setLayoutManager(mLayoutManager); //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 recycler_view.setHasFixedSize(true); makeData(); refreshRecyclerView(); } //循环生成一组假数据,作为RecyclerView的子项数据源,后续将会对recyclerDataBeans中的这20条数据进行操作 private void makeData(){ for(int i=0; i<20; i++){ RecyclerDataBean recyclerDataBean = new RecyclerDataBean(); recyclerDataBean.setIndex(String.valueOf(i)); recyclerDataBeans.add(recyclerDataBean); } recyclerAdapter = new RecyclerAdapter(recyclerDataBeans); recycler_view.setAdapter(recyclerAdapter); } //刷新recyclerview private void refreshRecyclerView() { recyclerAdapter = new RecyclerAdapter(recyclerDataBeans); recycler_view.setAdapter(recyclerAdapter); //定义recyclerview的子项点击事件 recyclerAdapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Utils.showLog("单击事件","click!!!"); Utils.showToast(RecyclerViewActivity.this,"您点击了的子项的序号为:"+recyclerAdapter.getItem(position).getIndex(),0); } }); //定义recyclerview的子项长按时间 recyclerAdapter.setOnItemLongClickListener(new RecyclerAdapter.OnItemLongClickListener() { @Override public void onItemLongClick(View view, final int position) { Utils.showLog("长按事件","click!!!"); AlertDialog.Builder builder = new AlertDialog.Builder(RecyclerViewActivity.this); builder.setTitle("警告"); builder.setCancelable(false); builder.setMessage("你想要删除序号为 " + recyclerAdapter.getItem(position).getIndex() + " 的数据么?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { try { //获取position(便于局部刷新recyclerview) int deleteposition = getPositionFromList(recyclerAdapter.getItem(position).getIndex()); //刷新UI recyclerAdapter.notifyItemRemoved(deleteposition); recyclerDataBeans.remove(deleteposition); refreshRecyclerView(); //提示用户 Utils.showToast(RecyclerViewActivity.this, "删除成功", 1); } catch (Exception e) { e.printStackTrace(); Utils.showToast(RecyclerViewActivity.this, "删除失败", 1); } dialog.dismiss(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } }); } //为了避免数据显示重复,每次初始化时都对RecyclerView进行一次初始化 private void clearRecyclerView(){ recyclerDataBeans = new ArrayList<>(); recyclerAdapter = new RecyclerAdapter(recyclerDataBeans); recycler_view.setAdapter(recyclerAdapter); } //根据studentID获取该条数据在list中的下标,便于对recyclerview进行局部刷新 private int getPositionFromList(String index){ List<RecyclerDataBean> list = recyclerDataBeans; for(int i=0;i<list.size();i++){ if(list.get(i).getIndex().equals(index)){ return i; } } return -1; } }五、写到最后
到这里,基本上把RecyclerView的简单用法就展示出来了,网上相关的教程和讲解也有很多,我这里就不再赘述了,只展示用法和效果,希望能够尽快的解决您的问题,不胜荣幸。下一期会讲解ListView的简单用法。
最后,欢迎大家在评论区留言。