Android RecyclerView使用方法解析

1.简介

  RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

总之ListView和GridView能做的RecyclerView都能做,并且能实现瀑布流效果

2.使用

在build.gradle配置RecyclerView的库
compile 'com.android.support:recyclerview-v7:23.3.0'

//设置RecyclerView的适配器 adapter = new MyRecyclerViewAdapter(RecyclerViewActivity.this,datas); recyclerview.setAdapter(adapter); //LayoutManager recyclerview.setLayoutManager(new LinearLayoutManager(RecyclerViewActivity.this, LinearLayoutManager.VERTICAL, false)); // recyclerview.scrollToPosition(datas.size()-1); //添加RecyclerView的分割线 recyclerview.addItemDecoration(new DividerListItemDecoration(RecyclerViewActivity.this,DividerListItemDecoration.VERTICAL_LIST)); //设置动画 recyclerview.setItemAnimator(new DefaultItemAnimator()); public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private final Context context; private final ArrayList<String> datas; public MyAdapter(Context context,ArrayList<String> datas){ this.context = context; this.datas = datas; } /** * 相当于ListView适配器中的getView的创建holder布局 * * @param parent * @param viewType * @return */ @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = View.inflate(context, R.layout.item_hello, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.tv_text.setText(datas.get(position)); holder.iv_icon.setBackgroundResource(R.mipmap.ic_launcher); } @Override public int getItemCount() { return datas.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private TextView tv_text; private ImageView iv_icon; public MyViewHolder(View itemView) { super(itemView); tv_text = (TextView) itemView.findViewById(R.id.tv_text); iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon); } } }

3.设置ListView&GridView&瀑布流类型效果

//设置List类型效果 recyclerview.setLayoutManager(new LinearLayoutManager(RecyclerViewActivity.this,LinearLayoutManager.VERTICAL,false)); //设置Grid类型效果 recyclerview.setLayoutManager(new GridLayoutManager(RecyclerViewActivity.this, 2, GridLayoutManager.VERTICAL, false)); //recyclerview.scrollToPosition(99); //设置瀑布流类型效果 recyclerview.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

4.分割线

参照网址:http://blog.csdn.net/lmj623565791/article/details/45059587

//设置分割线-分割线需要自定义&还可以自定义分割线的样式 //没有提供默认的分割线 recyclerview.addItemDecoration(new DividerListItemDecoration(this, DividerListItemDecoration.VERTICAL_LIST)); 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); } } } DividerListItemDecoration

设置分割线样式:

①application设置

<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:listDivider">@drawable/divider_bg</item> </style>

②在activity中

<activity android:name=".recyclerview.RecyclerViewActivity" android:theme="@style/listDividerTheme"/> <style name="listDividerTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:listDivider">@drawable/divider_bg</item> </style>

5.自定义设置item的点击事件

RecyclerView默认是没有点击事件的,需要自定义点击事件
用到知识点:接口,getLayoutPosition()

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ private final Context context; private final ArrayList<String> datas; //设置点击某个item的监听 public interface OnItemClickListener{ void onItemClick(View view,int position,String content); } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } //设置点击图片 public interface OnImageViewClickListener{ void onImageViewClick(View view,int position); } private OnImageViewClickListener onImageViewClickListener; public void setOnImageViewClickListener(OnImageViewClickListener onImageViewClickListener) { this.onImageViewClickListener = onImageViewClickListener; } ................................... class MyViewHolder extends RecyclerView.ViewHolder { private TextView tv_text; private ImageView iv_icon; public MyViewHolder(View itemView) { super(itemView); tv_text = (TextView) itemView.findViewById(R.id.tv_text); iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon); //设置点击事件 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onItemClickListener != null){ onItemClickListener.onItemClick(v,getLayoutPosition(),datas.get(getLayoutPosition())); } } }); //设置监听 iv_icon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onImageViewClickListener != null){ onImageViewClickListener.onImageViewClick(v,getLayoutPosition()); } } }); } } }

在Activity中使用自定义的点击事件

//设置点击item的点击事件 myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position, String content) { Toast.makeText(RecyclerViewActivity.this, "content=="+content+",--position=="+position, Toast.LENGTH_SHORT).show(); } }); //设置点击某张图片的点击事件 myAdapter.setOnImageViewClickListener(new MyAdapter.OnImageViewClickListener() { @Override public void onImageViewClick(View view, int position) { Toast.makeText(RecyclerViewActivity.this, "position=="+position+",view=="+view.toString(), Toast.LENGTH_SHORT).show(); } });

6.删除和增加数据

1_在适配器中新增加添加和删除两个方法

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { ........................ public void addData(int position,String content){ datas.add(position,content); notifyItemInserted(position); } public void removeData(int position){ datas.remove(position); notifyItemRemoved(position); } }

2_Activity中

btn_add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myAdapter.addData(0,"Content NetData"); //定位到第0个位置 recyclerview.scrollToPosition(0); } }); btn_remove.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myAdapter.removeData(0); } });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-25 15:03:17

Android RecyclerView使用方法解析的相关文章

Android RecyclerView使用方法解析_Android

1.简介 RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持.RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果. 总之ListView和GridView能做的RecyclerView都能做,并且能实现瀑布流效

Android 使用Pull方法解析XML文件的方法_Android

Pull解析方法给应用程序完全的控制文档该怎么样被解析.Android中对Pull方法提供了支持的API,主要是 复制代码 代码如下: org.xmlpull.v1.XmlPullParser;org.xmlpull.v1.XmlPullParserFactory; 二个类,其中主要使用的是XmlPullParser,XmlPullParserFactory是一个工厂,用于构建XmlPullParser对象.应用程序通过调用XmlPullParser.next()等方法来产生Event,然后再处

Android RecyclerView 使用完全解析 体验艺术般的控件

转自 :http://blog.csdn.net/lmj623565791/article/details/45059587 概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用.  据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView.GridView. 那么有了ListView.GridView为什么还需要RecyclerView这样的控件呢?整体上看Recycler

Android指纹解锁方法解析

我先说说这两种的方式的不同之处吧 第一种: 在调动成功之后 不会让你指纹解锁 而是调转到当初你设置指纹解锁时的 手势解锁页面 第二种: 在调动成功之后,是进行指纹解锁 不调转 你直接把手指放到金属感应环 上面进行指纹验证 大家可以根据需求 自行选择 ok 那就亮代码了 第一种: xml 布局: 一个 文本显示 一个按钮(不解释) MainActivity.java源码 public class MainActivity extends FragmentActivity { Fingerprint

android xml-android中用什么方法解析xml文件速度快?

问题描述 android中用什么方法解析xml文件速度快? 要解析本地大一点的xml文件,用什么方法速度快?希望大神能说详细点,感激不尽,,,,,,, 解决方案 对于内存资源非常宝贵的移动设备,在解析XMl文件时最好是使用PULL解析,这种解析方式是事件驱动的,可以中途停止的,不至于将整个文件全部加载到内存中. 解决方案二: 有多大?几十m?几百m?

Android RecyclerView艺术般的控件使用完全解析_Android

RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView.GridView. 那么有了ListView.GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecorati

Android开发之DOM解析xml文件的方法_Android

本文实例讲述了Android中DOM解析xml文件的方法.分享给大家供大家参考,具体如下: 一.在assets文件中写xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <pe

Android中使用Gson解析JSON数据的两种方法_Android

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海". 第三种类型是映射(mapping),也就是一个名/值对(

Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法_Android

RecyclerView 已经出来很久了,但是在项目中之前都使用的是ListView,最近新的项目上了都大量的使用了RecycleView.尤其是瀑布流的下拉刷新,网上吧啦吧啦没有合适的自己总结了一哈. 先贴图上来看看:     使用RecyclerView实现上拉加载更多和下拉刷新的功能我自己有两种方式: 1.使用系统自带的Android.support.v4.widget.SwipeRefreshLayout这个控价来实现. 2.自定义的里面带有RecyleView的控件. 使用Recycl