android之recyclerview的基本使用

简介:

Google在推出Android5.0的时候推出了Material Design ,RecyclerViewMaterial Design 重要组件之一。当然还有CardView/Palette。

RecyclerView是用来替换传统的ListViewGridView,瀑布流效果的。是的RecyclerView这一个控件,可以实现这三个效果。虽然在开始使用recyclerview的时候会感到有些男,但是用熟练了会发现recyclerview十分强大。它可以给每一item里面的控件设置点击时间,而不需要担心事件冲突的问题,如果是使用listview或者是gridview就必须要解决事件冲突,甚至listviewgridviewitem只能设置一个点击事件,否则就会造成事件冲突,而这些冲突并不好解决。所以recyclerview来了。

首先在项目中集成RecyclerView,在build.gradle添加RecyclerView的依赖

compile 'com.android.support:recyclerview-v7:23.2.1'

这样项目中就集成 recyclerview了,Android Studio 会自动联网下载 recyclerview包。

activity_main.xml中,使用recyclerview.

1
2
3
4
< android.support.v7.widget.RecyclerView
     android:id = "@+id/recyclerView"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"  />

布局中已经有了recyclerview的控件,下面就开始在代码中编写。

    在这里解释一下recyclerview的使用。就像listview那样,recyclerview也需要一个适配器;在我们优化listview的时候,我们经常会使用到一个内部类ViewHolder来保存item中的控件,以便于item的复用。而现在recyclerview则必须使用ViewHolder。这个ViewHolder必须继承RecyclerView.ViewHolder,RecyclerView.ViewHolder有一个参数的构造方法,传入的是一个view,这个view 就是recyclerview的item。

RecyclerViewHolder:

1
2
3
4
5
6
7
8
9
public  class  RecyclerViewHolder  extends  RecyclerView.ViewHolder {
     public  TextView textView;
     public  ImageView imageView;
     public  RecyclerViewHolder(View itemView) {
         super (itemView);
         textView = (TextView) itemView.findViewById(R.id.textView);
         imageView = (ImageView) itemView.findViewById(R.id.imageView);
     }
}

RecyclerViewHolder写好之后就开始写Adapter.同样RecyclerAdapter需要继承RecyclerView.Adapter<RecyclerViewHolder>,泛型ViewHolder就是自己自定义的RecyclerViewHolder。Adapter的写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public  class  RecyclerAdapter  extends  RecyclerView.Adapter<RecyclerViewHolder> {
     private  List<Map<String, String>> dataList;
 
     public  RecyclerAdapter() {
         dataList =  new  ArrayList<>();
     }
 
     public  void  addAll(List<Map<String, String>> data){
         dataList.addAll(data);
     }
 
     /**
      *
      * @param viewType 对应的是getItemViewType(int position)方法返回的数值
      */
     @Override
     public  RecyclerViewHolder onCreateViewHolder(ViewGroup parent,  int  viewType) {
         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,  false );
         return  new  RecyclerViewHolder(view);
     }
 
     /**
      *
      * @param holder 对应的是onCreateViewHolder方法,返回的RecyclerViewHolder
      * @param position 当前的item的位置
      */
     @Override
     public  void  onBindViewHolder(RecyclerViewHolder holder,  int  position) {
         holder.textView.setText(dataList.get(position).get( "data" ));
     }
 
     @Override
     public  int  getItemCount() {
         return  dataList.size();
     }
}

MainActivity中的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public  class  MainActivity  extends  AppCompatActivity {
 
     private  RecyclerView recyclerView;
     //使用线性布局管理器,设置的方向orientation是默认,即垂直方向
     private  LinearLayoutManager manager;
     //适配器
     private  RecyclerAdapter adapter;
     //数据源
     private  List<Map<String, String>> list;
 
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
         manager =  new  LinearLayoutManager( this );
         adapter =  new  RecyclerAdapter();
         //设置布局管理器
         recyclerView.setLayoutManager(manager);
         //给recyclerview设置适配器
         recyclerView.setAdapter(adapter);
         list =  new  ArrayList<>();
         for  ( int  i= 0 ;i< 50 ;i++)
         {
             Map<String,String> map =  new  HashMap<>();
             map.put( "data" "item-->   " +i);
             list.add(map);
         }
         adapter.addAll(list);
         adapter.notifyDataSetChanged();
     }
}

recyclerview实现listview的效果就完成了,运行效果:

wKiom1bwAm6gFtn-AACorefEJoQ425.png

如果是想每个item横向滑动的话,只需要使用LinearLayoutManager的三个参数的构造方法就行了,new LInearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)就可以实现横向滑动的效果了。

    recyclerView实现GridView的效果。需要是用是GridLayoutManager。将recyclerView的布局管理器更换成GridLayoutManager manager = new GridLayoutManager(this, 2),效果图如下:

wKiom1bwBiXzf2LxAADEl4akjZo408.png

给RecyclerView添加滚动监听。与listView和gridView有写不同,recyclerView判断滚动到哪一个位置的饿时候,需要使用到使用到布局管理器(前面设置的recyclerview.setLayoutManager())。滚动监听的方法有两个,setOnScrollListener(已不推荐使用)和addOnScrollListener。两个方法本质上是一致的。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
recyclerView_follow.addOnScrollListener( new  RecyclerView.OnScrollListener() {
     @Override
     public  void  onScrollStateChanged(RecyclerView recyclerView,  int  newState) {
         super .onScrollStateChanged(recyclerView, newState);
         //滚动的状态改变时,调用此方法。
     }
 
     @Override
     public  void  onScrolled(RecyclerView recyclerView,  int  dx,  int  dy) {
         super .onScrolled(recyclerView, dx, dy);
         //屏幕中最下面一个item的所在数据源的位置(postion)。
         int  lastVisiableItem = manager.findLastVisibleItemPosition();
         //一共有多少个
         int  totalItemCount = manager.getItemCount();
         //当滑动到倒数第二个item时,即联网获取下一页的数据
         if  (lastVisiableItem >= totalItemCount -  2  && dy >  0 ) {
             page++; //第二页
             reloadData(page);
         }
     }
});

    给RecyclerView添加监听事件:

    首先在Adapter中的onBindViewHolder方法中设置点击事件,使用holder.xxx.setOnClickListener()设置点击事件.RecyclerView避免了事件的冲突问题,可以给每个item中的控件设置点击事件.



本文转自 墨宇hz 51CTO博客,原文链接:http://blog.51cto.com/zzhhz/1753676


        

相关文章
|
9月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
119 2
|
缓存 Android开发
Android RecyclerView 实现瀑布流
Android RecyclerView 实现瀑布流
|
Android开发
Android RecyclerView的notify方法和动画的刷新详解(二)
Android RecyclerView的notify方法和动画的刷新详解
326 0
|
Android开发
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等(三)
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等
|
Android开发
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等(一)
Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等
|
5月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
420 9
|
9月前
|
安全 Android开发
Android之OKHttp基本使用和OKHttp发送https请求安全认证
Android之OKHttp基本使用和OKHttp发送https请求安全认证
334 0
|
5月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
97 8
|
6月前
|
存储 Android开发 开发者
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
68 0
|
6月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
53 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)