RecyclerView的简单使用
来源:互联网 发布:中国象棋训练软件 编辑:程序博客网 时间:2024/05/17 16:53
- 前言
- 1.控件使用
- 2.Adapter和LayoutManager
- ①LayoutManager布局管理器
- ②Adapter适配器
- ③Decoration修饰器
- 3.添加和删除
- 4.点击事件
前言
RecyclerView不仅可以完全取缔ListView和GridView,还可以有很多其他的效果,可以非常炫酷,今天先来记录下最简单的使用.
RecyclerView是自Android 5.0之后才发布的,要使用它要先根据自己sdk的版本进行导包:
compile 'com.android.support:recyclerview-v7:25.3.1'
导包完成后就可以开始使用了.
1.控件使用
RecyclerView是一个控件,它的使用方法跟ListView的用法差不多,直接在布局中使用.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main2" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#5555" tools:context="com.simon.demo.my.Main2Activity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/add_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加item"/> <Button android:id="@+id/delete_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除item"/> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:paddingLeft="3dp" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
2.Adapter和LayoutManager
在使用RecyclerView时候,必须指定一个适配器Adapter和一个布局管理器LayoutManager。适配器继承RecyclerView.Adapter类,具体实现类似ListView的适配器,取决于数据信息以及展示的UI。布局管理器用于确定RecyclerView中Item的展示方式以及决定何时复用已经不可见的Item,避免重复创建以及执行高成本的findViewById()方法。
①LayoutManager布局管理器
RecyclerView提供了三种布局管理器:
- LinerLayoutManager 以垂直或者水平列表方式展示Item
- GridLayoutManager 以网格方式展示Item
- StaggeredGridLayoutManager 以瀑布流方式展示Item
//这里使用了线性垂直列表mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);mRecyclerView.setLayoutManager(mLinearLayoutManager);
②Adapter适配器
创建一个类继承RecyclerView.Adapter
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder>{ private final Context context; private final ArrayList<String> mData; public RecycleAdapter(Context c, ArrayList<String> data){ this.context = c; this.mData = data; } //获取item布局,并创建ViewHolder与之绑定 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //这里填充的布局root写parent的话,会只显示一个item,改为null后才正常显示 //解决http://blog.csdn.net/fantasiasango/article/details/52188064 //如果用View.inflate填充的布局没有调用到设置的属性// View view = View.inflate(parent.getContext(), R.layout.view_rv_item, null); View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rv_item, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } // @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mTx.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } public static class ViewHolder extends RecyclerView.ViewHolder{ //有写情况下需要手动设置属性,不然布局会显示不正常 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); itemView.setLayoutParams(layoutParams); private final TextView mTx; public ViewHolder(View itemView) { super(itemView); mTx = (TextView) itemView.findViewById(R.id.item_tv); } }}
Activity中使用代码
mRecycleAdapter = new RecycleAdapter(this,getData()); mRecyclerView.setAdapter(mRecycleAdapter); //模拟数据 private ArrayList<String> getData() { ArrayList<String> strings = new ArrayList<>(); for(int i = 0; i < 50; i++) { strings.add("我是超人"+i); } return strings; }
③Decoration修饰器
这是用来自定义RecycleView的样式,decoration的样式可以同时使用多个,不同的decoration效果会重叠起来,从而达到不同的效果.
主要使用的三个方法:
public void onDraw(Canvas c, RecyclerView parent, State state)public void onDrawOver(Canvas c, RecyclerView parent, State state)public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)
举例使用:
public class MyItemDecoration extends RecyclerView.ItemDecoration { private final Paint mPaint; private final int mDividerHeight; public MyItemDecoration(Context context) { mPaint = new Paint(); mPaint.setColor(Color.BLUE); mDividerHeight = 10; } // 这两个方法都是用于绘制间隔样式 @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); int childCount = parent.getChildCount(); int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); for (int i = 0; i < childCount - 1; i++) { View view = parent.getChildAt(i); int top = view.getBottom(); int bottom = view.getBottom() + 5; Log.v("cherish233", "left:" + left + "---" + "top:" + top + "---" + "right:" + right + "---" + "bottom:" + bottom + "---"); c.drawRect(left, top, right, bottom, mPaint); } // View view = parent.getChildAt(0); // int top = view.getBottom(); // int bottom = view.getBottom() + mDividerHeight; // Log.v("cherish233", "left:" + left + "---" + "top:" + top + "---" + "right:" + right + "---" + "bottom:" + bottom + "---"); // c.drawRect(left, top, right, bottom, mPaint); } //设置item的偏移量,偏移的部分用于填充间隔样式 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); outRect.bottom = mDividerHeight; }}
在Activity中的使用代码
mMyItemDecoration = new MyItemDecoration(this);mRecyclerView.addItemDecoration(mMyItemDecoration);
完整的Activity代码:
public class Main2Activity extends AppCompatActivity implements View.OnClickListener { private Button mAddBtn; private Button mDeleteBtn; private RecyclerView mRecyclerView; private LinearLayout mActivityMain2; private LinearLayoutManager mLinearLayoutManager; private RecycleAdapter mRecycleAdapter; private MyItemDecoration mMyItemDecoration; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); initData(); } private void initData() { mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mRecycleAdapter = new RecycleAdapter(this,getData()); mMyItemDecoration = new MyItemDecoration(this); mRecyclerView.setLayoutManager(mLinearLayoutManager); mRecyclerView.setAdapter(mRecycleAdapter); mRecyclerView.addItemDecoration(mMyItemDecoration); } //模拟数据 private ArrayList<String> getData() { ArrayList<String> strings = new ArrayList<>(); for(int i = 0; i < 50; i++) { strings.add("我是超人"+i); } return strings; } private void initView() { mAddBtn = (Button) findViewById(R.id.add_btn); mAddBtn.setOnClickListener(this); mDeleteBtn = (Button) findViewById(R.id.delete_btn); mDeleteBtn.setOnClickListener(this); mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.add_btn: break; case R.id.delete_btn: break; } }}
最终效果:
3.添加和删除
要想添加和删除数据,只需要在Adapter中添加两个方法
//添加数据 public void addNewItem(){ if(mData == null) { mData = new ArrayList<>(); } mData.add(0, "new Item"); //用notifyItemInserted(0)来刷新需要更新的Item,如果用notifyDataSetChanged()没有动画效果 notifyItemInserted(0); } //删除数据 public void deleteItem(int position) { if (mData == null || mData.isEmpty()) { return; } mData.remove(position); notifyItemRemoved(position); //删除数据后要进行刷新,否则下次删除的时候position会对应错误 notifyDataSetChanged(); }
然后在你需要的地方进行调用,我是在MainActivity中添加了两个按钮进行简单的添加和删除操作
@Override public void onClick(View v) { switch (v.getId()) { case R.id.add_btn: mRecycleAdapter.addNewItem(); //回到第一个Item mLinearLayoutManager.scrollToPosition(0); break; case R.id.delete_btn: mRecycleAdapter.deleteItem(); mLinearLayoutManager.scrollToPosition(0); break; } }
效果如下:
RecyclerView可以设置列表中Item删除和添加的动画,V7包中提供了一个默认动画,只需设置一下就可以了.
// 设置Item添加和移除的动画mRecyclerView.setItemAnimator(new DefaultItemAnimator());
效果:
4.点击事件
RecyclerView并没有像ListView一样提供点击事件,需要自己自定义点击事件和长按事件.
通过在绑定ViewHolder的时候设置监听,然后通过Apater回调出去
在Adapter里创建一个监听器,并提供一个方法:
interface OnItemClickListener { void onClick(); void onLongClick(); } //设置为全局变量 private OnItemClickListener mOnItemClickListener; public void setItemClickListener(OnItemClickListener listener) { mOnItemClickListener = listener; }
然后对ViewHolder设置监听
@Override public void onBindViewHolder(ViewHolder holder, final int position) { Log.v("cherish233","onBindViewHolder:"+position); holder.mTx.setText(mData.get(position)); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { mOnItemClickListener.onLongClick(position); return true; } }); }
设置完监听后,就回到Activity,对Adapter设置监听,并实现方法
//设置点击事件 private void setClickEvent() { mRecycleAdapter.setItemClickListener(new RecycleAdapter.OnItemClickListener() { @Override public void onClick() { Toast.makeText(getApplicationContext(),"我点击了一下",Toast.LENGTH_SHORT).show(); } @Override public void onLongClick() { Toast.makeText(getApplicationContext(),"我长按了item",Toast.LENGTH_SHORT).show(); } }); }
现在只是简单睇地介绍了一下,不仅不够完善,而且还有很多效果没有做出来,等有时间再好好研究下.
- RecyclerView的简单使用
- RecyclerView 的简单使用
- recyclerview的简单使用
- Recyclerview的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView 的简单使用
- Recyclerview的简单使用
- RecyclerView的简单使用
- Visual C++内存泄露检测—VLD工具使用说明
- 【Qt5】创建文件夹
- gdb出现During startup program exited with code 127的解决方法
- 51nod 2006 飞行员配对(二分图最大匹配)
- <meta>标签
- RecyclerView的简单使用
- 进程间通信的几种方式浅谈
- 举例说明c++对象内存空间计算(虚函数表,虚继承)
- Win10 环境下科大讯飞语音合成5.0破解版 安装方法
- Oracle删除当前连接用户
- gdb调试多线程多进程程序
- django-crontab使用时遇到‘No handlers cloud be found for logger "django_crontab.crontab" ’
- python--学习第一天
- 什么是webpack(项目总结)