Android RecyclerView使用方法解析_Android

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);
 }
});

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
recyclerview
recyclerview源码解析、recyclerview解析、android recyclerview、androidrecyclerview、recyclerview使用方法,以便于您获取更多的相关知识。

时间: 2024-08-03 02:58:39

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

Android RecyclerView使用方法解析

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

Android Material设计中列表和卡片的创建方法解析_Android

5.0提供了两个新的Widget,它们使用了Material Design 的style和animation: RecyclerView 一个更可插拔式的ListView,它支持不同的布局类型,并且性能有了改进.(列表式) CardView 一个能让你在其内显示重要信息,并保持连贯的视觉和感觉的卡片.(卡片式) 它两位于 sdk/extras/android/support/v7/cardview 和 sdk/extras/android/support/v7/RecyclerView 创建列表

Android RecyclerView 数据绑定实例代码_Android

前言 在上一个项目里有很多很多很多很多的RecyclerView,然后我需要写很多很多很多很多的Adapter和Viewholder--多倒没问题,但是里面有很多重复的代码这就不能忍了!每一个Adapter和ViewHolder其实做的事情非常的像:视图绑定,数据绑定,点击事件分发.还有啥?既然它们做的事情都一样,为啥我们还要傻傻的继续写着重复的代码? 正文 BaseAdapter 通常我们要创建一个RecyclerView.Adapter是怎么做的? 接收一个数据列表 重写getItemCou

Android RecyclerView实现下拉列表功能_Android

现在市面上的很多的应用,都带有下拉列表的功能,将所有选项都放在下拉列表中,当用户点击选择的时候,弹出所有的选项,用户选择一项后,下拉列表自动隐藏,很多下拉列表都是用ListView + PopupWindow来实现的,由于Google推出了替代ListView的RecyclerView,所以简单实现一下: MainActivity.java package com.jackie.countdowntimer; import android.graphics.drawable.BitmapDraw

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

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

android textview 显示html方法解析_Android

现在网络的繁盛时代,光文字是不能满足人们的胃口的,图片,flash,音频,视频就成为浏览网页的主流显示,在手机上也一样.在手机上显示从网络端获取的数据显示,大家很自然的想起两种方式,一种就是webview,一种就是TextView.当然webView直接显示html页面就行了,我主要说的TextView显示html内容. 首先,说下TextView到底支持那些标签呢,通过对源码的查看,发现Textview可以解析一部分html标签,如: 复制代码 代码如下: <a href="...&qu

Android的HTTP扩展包OkHttp中的缓存功能使用方法解析_Android

OkHttp 可以对 HTTP 响应的内容在磁盘上进行缓存.在进行 HTTP 请求时,如果该请求的响应已经被缓存而且没有过期,OkHttp 会直接使用缓存中的响应内容,而不需要真正的发出 HTTP 请求到远程服务器.在创建缓存时需要指定一个磁盘目录和缓存的大小.在代码清单 8 中,创建出 Cache 对象之后,通过 OkHttpClient 的 setCache 进行设置.通过 Response 对象的 cacheResponse 和 networkResponse 方法可以得到缓存的响应和从实

Android应用开发中触摸屏手势识别的实现方法解析_Android

很多时候,利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读器中翻页等.在Android系统中,手势的识别是通过 GestureDetector.OnGestureListener接口来实现的,不过William翻遍了Android的官方文档也没有找到一个相 关的例子,API Demo中的TouchPaint也仅仅是提到了onTouch事件的处理,没有涉及到手势. 我们先来明确一些概念

android+json+php+mysql实现用户反馈功能方法解析_Android

相信每个项目都会有用户反馈建议等功能,这个实现的方法很多,下面是我实现的方法,供大家交流.首先看具体界面,三个字段.名字,邮箱为选填,可以为空,建议不能为空.如有需要可以给我留言.  下面贴出布局代码,这里用到一个<include layout="@layout/uphead">就是把另外一个布局文件引入到这个布局中. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> &l