Android高级UI开发(一)RecyclerView控件的基本使用

举报
yd_57386892 发表于 2020/12/28 22:34:54 2020/12/28
【摘要】         学了Android开发这么久,Google新出的许多控件在实际项目中几乎没有用过,深感惭愧。今天就来介绍一下控件RecyclerView,简单的说就是列表控件ListView的升级版,还是一个列表控件,只是性能和扩展性远远超过了ListView列表控件。这么好的升级版控件竟然没有使用到项目中,我这个开发人员的水平是不是太差了,是不是没能与时俱进。好吧,话说多了...

        学了Android开发这么久,Google新出的许多控件在实际项目中几乎没有用过,深感惭愧。今天就来介绍一下控件RecyclerView,简单的说就是列表控件ListView的升级版,还是一个列表控件,只是性能和扩展性远远超过了ListView列表控件。这么好的升级版控件竟然没有使用到项目中,我这个开发人员的水平是不是太差了,是不是没能与时俱进。好吧,话说多了总会有人误解你,正所谓言多必失。没用过不代表不会用,今天就先介绍下RecyclerView的基本用法。

     

1.  在布局文件里声明RecyclerView控件:(运行效果图在文章最后)

 


  
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <android.support.v7.widget.RecyclerView
  7. android:id="@+id/recylerview"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. />
  11. </RelativeLayout>
在布局里声明 RecyclerView控件 与 基本的ListView、TextView、Button控件的声明方法一样,唯一的区别是前面多了
 
android.support.v7.widget,为何?因为RecyclerView控件被定义在  ANDROID SDK文件目录下的 support V7 扩展库里,且
 
这个控件最低兼容到ANDROID系统Level 7级别(android2.1).
 

 

2.  build.gradle文件引入android.support.v7.widget.RecyclerView

   由于android.support.v7是一个扩展库,因此我们要显式的引入这个库。修改build.gradle,添加红色部分:

 
 

  
  1. apply plugin: 'com.android.application'
  2. android {
  3. compileSdkVersion 26
  4. defaultConfig {
  5. applicationId "com.anyikang.volunteer.sos.recyclerview"
  6. minSdkVersion 19
  7. targetSdkVersion 23
  8. versionCode 1
  9. versionName "1.0"
  10. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  11. }
  12. buildTypes {
  13. release {
  14. minifyEnabled false
  15. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  16. }
  17. }
  18. }
  19. dependencies {
  20. implementation fileTree(include: ['*.jar'], dir: 'libs')
  21. implementation 'com.android.support:appcompat-v7:25.4.0'
  22. implementation 'com.android.support:recyclerview-v7:23.0.1'
  23. implementation 'com.android.support.constraint:constraint-layout:1.0.2'
  24. testImplementation 'junit:junit:4.12'
  25. androidTestImplementation 'com.android.support.test:runner:1.0.1'
  26. androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
  27. implementation 'com.android.support:design:23.0.1'
  28. }
3. 主要代码 
 
  (1) 创建一个MainActivity类来加载这个布局
 

 

 
 

  
  1. package com.anyikang.volunteer.sos.recyclerview;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.support.v7.widget.GridLayoutManager;
  5. import android.support.v7.widget.RecyclerView;
  6. import java.util.ArrayList;
  7. public class MainActivity extends Activity {
  8. private RecyclerView recylerview; //RecyclerView控件实例对象
  9. private ArrayList<String> list; //RecyclerView要显示的 列表数据,在此为一组字符串。
  10. private MyRecyclerAdapter adapter; //同ListView一样,需要一个适配器来 将list数据 装载到 RecyclerView列表控件。
  11. //private MyStaggedRecyclerAdapter adapter; //列表显示风格 为瀑布流 界面样式 的 适配器。
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. //模拟60条数据
  17. list = new ArrayList<String>();
  18. for (int i = 0; i < 60; i++) {
  19. list.add("item"+i);
  20. }
  21. //实例化布局中的recylerview控件
  22. recylerview = (RecyclerView)findViewById(R.id.recylerview);
  23. //普通列表的适配器
  24. adapter = new MyRecyclerAdapter(list);
  25. //列表显示风格为 垂直方向的列表
  26. //recylerview.setLayoutManager(new LinearLayoutManager(this));
  27. //列表显示风格为 水平方向的列表
  28. // recylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
  29. //列表显示风格为 瀑布流样式
  30. //recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));
  31. //列表显示风格为 网格样式,如9宫格布局
  32. recylerview.setLayoutManager(new GridLayoutManager(this, 3));
  33. //adapter = new MyStaggedRecyclerAdapter(list); 瀑布流适配器,与普通适配器adapter的区别是,每一个列表项的布局大小都可能参差不齐。
  34. //装载显示列表数据
  35. recylerview.setAdapter(adapter);
  36. }
  37. }
(2)普通adapter
 

  
  1. package com.anyikang.volunteer.sos.recyclerview;
  2. import android.support.v7.widget.RecyclerView;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.TextView;
  6. import java.util.List;
  7. public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
  8. private List<String> list; //列表数据
  9. public MyRecyclerAdapter(List<String> list) {
  10. // TODO Auto-generated constructor stub
  11. this.list = list;
  12. }
  13. /**
  14. *
  15. * 实例化 列表项布局中的控件,在此为一个简单的textview
  16. */
  17. class MyViewHolder extends RecyclerView.ViewHolder{
  18. TextView tv;
  19. public MyViewHolder(View view) {
  20. super(view);
  21. tv = (TextView)view.findViewById(R.id.text1);
  22. }
  23. }
  24. /**
  25. * 要显示的列表项数
  26. * @return 列表项总数
  27. */
  28. @Override
  29. public int getItemCount() {
  30. // TODO Auto-generated method stub
  31. return list.size();
  32. }
  33. /**
  34. * 用数据填充列表项上的 textview文本
  35. * @param holder: 当前列表项 布局的 控件实例
  36. * @param position: 列表项的索引
  37. */
  38. @Override
  39. public void onBindViewHolder(MyViewHolder holder, int position) {
  40. holder.tv.setText(list.get(position)); //将列表数据list数组中的position位置的字符串 填充给 这个列表项上的textview
  41. }
  42. /**
  43. * 为列表项实例化布局,将在onBindViewHolder里为布局控件赋值
  44. * @param viewGroup
  45. * @param arg1
  46. * @return
  47. */
  48. @Override
  49. public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
  50. MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), R.layout.list_item, null));
  51. return holder;
  52. }
  53. }

 

   (3)瀑布流adapter

 

 


  
  1. package com.anyikang.volunteer.sos.recyclerview;
  2. import android.graphics.Color;
  3. import android.support.v7.widget.RecyclerView;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.view.ViewGroup.LayoutParams;
  7. import android.widget.TextView;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /**
  11. * 瀑布流列表,即每一个列表项的高度都不一样
  12. */
  13. public class MyStaggedRecyclerAdapter extends RecyclerView.Adapter<MyStaggedRecyclerAdapter.MyViewHolder> {
  14. private List<String> list; //列表数据
  15. private List<Integer> heights; //每一个列表项的高度
  16. public MyStaggedRecyclerAdapter(List<String> list) {
  17. // TODO Auto-generated constructor stub
  18. this.list = list;
  19. //为每一个列表项分配一个随机的高度
  20. heights = new ArrayList<Integer>();
  21. for (int i = 0; i < list.size(); i++) {
  22. heights.add((int)(200+ Math.random()*50));
  23. }
  24. }
  25. class MyViewHolder extends RecyclerView.ViewHolder{
  26. TextView tv;
  27. public MyViewHolder(View view) {
  28. super(view);
  29. tv = (TextView)(view.findViewById(R.id.text1));
  30. }
  31. }
  32. @Override
  33. public int getItemCount() {
  34. // TODO Auto-generated method stub
  35. return list.size();
  36. }
  37. /**
  38. * 用于展示绘制列表项数据
  39. * @param holder
  40. * @param position
  41. */
  42. @Override
  43. public void onBindViewHolder(MyViewHolder holder, int position) {
  44. //修改每一个列表项的高度 为 预先设定好的heights数组中的高度,让它们呈现瀑布样式
  45. LayoutParams params = holder.tv.getLayoutParams();
  46. params.height = heights.get(position);
  47. holder.tv.setBackgroundColor(Color.rgb(100, (int)(Math.random()*255), (int)(Math.random()*255)));
  48. holder.tv.setLayoutParams(params);
  49. //填充文本数据
  50. holder.tv.setText(list.get(position));
  51. }
  52. @Override
  53. public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
  54. MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), R.layout.list_item, null));
  55. return holder;
  56. }
  57. }
4. 运行效果
 

(1). 网格式

 


  
  1. //普通列表的适配器
  2. adapter = new MyRecyclerAdapter(list);
  3. recylerview.setLayoutManager(new GridLayoutManager(this, 3));
  4. //装载显示列表数据
  5. recylerview.setAdapter(adapter);
 
 

 

 

(2)垂直方向的列表


  
  1. //普通列表的适配器
  2. adapter = new MyRecyclerAdapter(list);
  3. //列表显示风格为 垂直方向的列表
  4. recylerview.setLayoutManager(new LinearLayoutManager(this))
//装载显示列表数据
 
recylerview.setAdapter(adapter);
 
 
 

 

 

(3)水平方向的列表


  
  1. //普通列表的适配器
  2. adapter = new MyRecyclerAdapter(list);
  3. //列表显示风格为 垂直方向的列表
  4. recylerview.setLayoutManager(new LinearLayoutManager(this))
//装载显示列表数据
 
recylerview.setAdapter(adapter);
 

(4)瀑布流样式的列表


  
  1. //瀑布流列表的适配器
  2. adapter = new MyStaggedRecyclerAdapter(list);
//列表显示风格为 瀑布流样式的列表
 
recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));
 
//装载显示列表数据
 
recylerview.setAdapter(adapter);
 
最后,源码地址:https://download.csdn.net/download/gaoxiaoweiandy/10351135

 
 
 
 
 

文章来源: blog.csdn.net,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/79952579

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。