RecyclerView使用介绍
来源:互联网 发布:热敏纸打印软件 编辑:程序博客网 时间:2024/05/17 20:52
RecyclerView 是Android L版本中新添加的一个用来取代ListView、GridView的SDK,它的灵活性与可替代性比listview更好。接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView.了解RecyclerView架构,可以高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator可以实现的想要的效果。
1、首先介绍几种LayoutManager
目前SDK中提供了三种自带的LayoutManager:
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
LinearLayoutManager mManager = new LinearLayoutManager(mContent); LinearLayoutManager mManager = new LinearLayoutManager(mContent, LinearLayoutManager.VERTICAL, false);//垂直布局,true表示左右翻转数据从后往前显示,false不翻转 数据从0往后显示。GridLayoutManager mManager = new GridLayoutManager(mContent,3); GridLayoutManager mManager = new GridLayoutManager(mContent,3,LinearLayoutManager.HORIZONTAL,false);//每行3列,水平,true表示左右翻转,false不翻转 mRecyclerView.setLayoutManager(mManager); //设置瀑布流效果recyclerview.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
2、RecycleView简单使用
//初始化控件 mRecyclerView = findView(R.id.id_recyclerview); //设置布局管理器 mManager = new LinearLayoutManager(mContent); mRecyclerView.setLayoutManager(mManager); //设置adapter mRecyclerView.setAdapter(mAdapter) //设置Item增加、移除动画 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //添加分割线 mRecyclerView.addItemDecoration(new DividerItemDecoration( getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
3、接下来介绍的就是RecyclerView的适配器了,同样,RecyclerView和ListView,GridView一样需要adapter来填充数据,同样,自定义一个adapter需要继承RecyclerView.Adapter,代码需要实现几个父类方法onCreateViewHolder,onBindViewHolder,getItemCount(),根据名字就能知道:
(1)onCreateViewHolder:主要返回的是拿到布局,进而返回ViewHolder
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell,null));
(2)onBindViewHolder:拿到ViewHolder中的控件对其赋值操作
(3)getItemCount():返回数组的size()
使用前必须先添加依赖包
在AS的build.gradle中添加依赖,然后同步一下就可以引入依赖包:
dependencies { compile 'com.android.support:recyclerview-v7:25.3.1'}
下面是今天主要记录的内容,那就是封装万能的RecyclerView的适配器。
BaseRecyclerAdapter适配器类:
package com.recyclerview;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import java.util.List;/** * 作者:willkong on 2017/7/20. * QQ号:547860818 * 作用:万能的RecyclerView适配器 */public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerHolder> { private Context context;//上下文 private List<T> list;//数据源 private LayoutInflater inflater;//布局器 private int itemLayoutId;//布局id private boolean isScrolling;//是否在滚动 private OnItemClickListener listener;//点击事件监听器 private OnItemLongClickListener longClickListener;//长按监听器 private RecyclerView recyclerView; //在RecyclerView提供数据的时候调用 @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); this.recyclerView = recyclerView; } @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { super.onDetachedFromRecyclerView(recyclerView); this.recyclerView = null; } /** * 定义一个点击事件接口回调 */ public interface OnItemClickListener { void onItemClick(RecyclerView parent, View view, int position); } public interface OnItemLongClickListener { boolean onItemLongClick(RecyclerView parent, View view, int position); } /** * 插入一项 * * @param item * @param position */ public void insert(T item, int position) { list.add(position, item); notifyItemInserted(position); } /** * 删除一项 * * @param position 删除位置 */ public void delete(int position) { list.remove(position); notifyItemRemoved(position); } public BaseRecyclerAdapter(Context context, List<T> list, int itemLayoutId,RecyclerView recyclerView) { this.context = context; this.list = list; this.itemLayoutId = itemLayoutId; this.recyclerView = recyclerView; inflater = LayoutInflater.from(context); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); isScrolling = !(newState == RecyclerView.SCROLL_STATE_IDLE); if (!isScrolling) { notifyDataSetChanged(); } } }); } @Override public BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(itemLayoutId, parent, false); return BaseRecyclerHolder.getRecyclerHolder(context, view); } @Override public void onBindViewHolder(final BaseRecyclerHolder holder, int position) { //点击背景 if (listener != null) { holder.itemView.setBackgroundResource(R.drawable.recycler_bg);//设置背景 } holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (listener != null && view != null && recyclerView != null) { int position = recyclerView.getChildAdapterPosition(view); listener.onItemClick(recyclerView, view, position); } } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (longClickListener != null && view != null && recyclerView != null) { int position = recyclerView.getChildAdapterPosition(view); longClickListener.onItemLongClick(recyclerView, view, position); return true; } return false; } }); convert(holder, list.get(position), position, isScrolling); } @Override public int getItemCount() { return list == null ? 0 : list.size(); } public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } public void setOnItemLongClickListener(OnItemLongClickListener longClickListener) { this.longClickListener = longClickListener; } /** * 填充RecyclerView适配器的方法,子类需要重写 * * @param holder ViewHolder * @param item 子项 * @param position 位置 * @param isScrolling 是否在滑动 */ public abstract void convert(BaseRecyclerHolder holder, T item, int position, boolean isScrolling);}
对应的ViewHolder类BaseRecyclerHolder:
package com.recyclerview;import android.content.Context;import android.graphics.Bitmap;import android.support.v7.widget.RecyclerView;import android.util.SparseArray;import android.view.View;import android.widget.ImageView;import android.widget.TextView;/** * 作者:willkong on 2017/7/20. * QQ号:547860818 * 作用:万能的RecyclerView的ViewHolder */public class BaseRecyclerHolder extends RecyclerView.ViewHolder { private SparseArray<View> views; private Context context; private BaseRecyclerHolder(Context context, View itemView) { super(itemView); this.context = context; //指定一个初始为8 views = new SparseArray<>(8); } /** * 取得一个RecyclerHolder对象 * * @param context 上下文 * @param itemView 子项 * @return 返回一个RecyclerHolder对象 */ public static BaseRecyclerHolder getRecyclerHolder(Context context, View itemView) { return new BaseRecyclerHolder(context, itemView); } public SparseArray<View> getViews() { return this.views; } /** * 通过view的id获取对应的控件,如果没有则加入views中 * * @param viewId 控件的id * @return 返回一个控件 */ @SuppressWarnings("unchecked") public <T extends View> T getView(int viewId) { View view = views.get(viewId); if (view == null) { view = itemView.findViewById(viewId); views.put(viewId, view); } return (T) view; } /** * 设置字符串 */ public BaseRecyclerHolder setText(int viewId, String text) { TextView tv = getView(viewId); tv.setText(text); return this; } /** * 设置图片 */ public BaseRecyclerHolder setImageResource(int viewId, int drawableId) { ImageView iv = getView(viewId); iv.setImageResource(drawableId); return this; } /** * 设置图片 */ public BaseRecyclerHolder setImageBitmap(int viewId, Bitmap bitmap) { ImageView iv = getView(viewId); iv.setImageBitmap(bitmap); return this; }// /**// * 设置图片// */// public BaseRecyclerHolder setImageByUrl(int viewId,String url){// Picasso.with(context).load(url).into((ImageView) getView(viewId));// // ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(context));// // ImageLoader.getInstance().displayImage(url, (ImageView) getView(viewId));// return this;// }}
分割线类DividerListItemDecoration:
package com.recyclerview;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;public class DividerListItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerListItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent) {// Log.e("recyclerview - itemdecoration", "onDraw()"); if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }}
点击阴影recycler_bg:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape android:shape="rectangle"> <solid android:color="#cfd8dc"/> </shape> </item></selector>
使用实例:
package com.recyclerview;import android.app.Activity;import android.os.Bundle;import android.support.v7.widget.DefaultItemAnimator;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import java.util.ArrayList;import static android.R.attr.data;public class MainActivity extends Activity implements View.OnClickListener { private Button btn_add; private Button btn_delete; private Button btn_list; private Button btn_grid; private Button btn_flow; private RecyclerView recyclerview; private ArrayList<String> datas;// private MyRecyclerViewAdapter adapter; private BaseRecyclerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); adapter = new BaseRecyclerAdapter<String>(MainActivity.this, datas, R.layout.item_recyclerview,recyclerview) { @Override public void convert(BaseRecyclerHolder holder, String item, int position, boolean isScrolling) { holder.setText(R.id.tv_title,item); } }; recyclerview.setAdapter(adapter); recyclerview.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false)); recyclerview.addItemDecoration(new DividerListItemDecoration(MainActivity.this,DividerListItemDecoration.VERTICAL_LIST)); adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position) { Toast.makeText(MainActivity.this,"data="+datas.get(position),Toast.LENGTH_SHORT).show(); } });// //设置recyclerview适配器// adapter = new MyRecyclerViewAdapter(MainActivity.this,datas);// recyclerview.setAdapter(adapter);// //LayoutManager// recyclerview.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));//// recyclerview.scrollToPosition(datas.size()-1);// //添加RecyclerView的分割线// recyclerview.addItemDecoration(new DividerListItemDecoration(MainActivity.this,DividerListItemDecoration.VERTICAL_LIST));//// //设置点击某条的监听// adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemClickListener() {// @Override// public void onItemClick(View view, String data) {// Toast.makeText(MainActivity.this,"data="+data,Toast.LENGTH_SHORT).show();// }// });// //设置动画// recyclerview.setItemAnimator(new DefaultItemAnimator()); } private void initView() { btn_add = (Button) findViewById(R.id.btn_add); btn_delete = (Button) findViewById(R.id.btn_delete); btn_list = (Button) findViewById(R.id.btn_list); btn_grid = (Button) findViewById(R.id.btn_grid); btn_flow = (Button) findViewById(R.id.btn_flow); recyclerview = (RecyclerView) findViewById(R.id.recyclerview); //设置点击事件 btn_add.setOnClickListener(this); btn_delete.setOnClickListener(this); btn_list.setOnClickListener(this); btn_grid.setOnClickListener(this); btn_flow.setOnClickListener(this); } private void initData() { //准备数据集合 datas = new ArrayList<>(); for (int i=0;i<100;i++){ datas.add("Content_"+i); } } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn_add:// adapter.addData(0,"New_Content"); adapter.insert("New_Content",0); recyclerview.scrollToPosition(0); break; case R.id.btn_delete:// adapter.removeData(0); adapter.delete(0); break; case R.id.btn_list: //设置List类型效果 recyclerview.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false)); break; case R.id.btn_grid: //设置Grid类型效果 recyclerview.setLayoutManager(new GridLayoutManager(MainActivity.this,2,GridLayoutManager.VERTICAL,true)); recyclerview.scrollToPosition(datas.size()-1); break; case R.id.btn_flow: //设置瀑布流效果 recyclerview.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL)); break; } }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.recyclerview.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="添加" android:textAllCaps="false" /> <Button android:id="@+id/btn_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="删除" android:textAllCaps="false" /> <Button android:id="@+id/btn_list" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="List" android:textAllCaps="false" /> <Button android:id="@+id/btn_grid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Grid" android:textAllCaps="false" /> <Button android:id="@+id/btn_flow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="flow" android:textAllCaps="false" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
item_recyclerview.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/white" android:padding="5dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#22000000" android:orientation="horizontal"> <ImageView android:id="@+id/iv_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ico_jiechu" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:text="Content" android:textAllCaps="false" android:textColor="#000000" /> </LinearLayout></RelativeLayout>
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- Android RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView简单使用介绍
- RecyclerView详细介绍&使用。
- Android RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView简单使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- 异常处理和正则表达式
- Linux下的重定向和管道
- Shape of HDU / HDU
- java获得平台相关的行分隔符和java路径分隔符的方法
- 镶嵌循环和控制循环
- RecyclerView使用介绍
- 小程序预约商城平台系统开发
- GitBucket 搭建属于自己的GitHub。
- Java--String,StringBuffer,StringBuilder的区别
- Android Kotlin使用指南
- 欢迎使用CSDN-markdown编辑器
- maven环境搭建并运行springboot项目
- LeetCode-13-Roman to Integer(罗马数字转换为整型数字)
- 服务架构的发展