android中RecyclerView怎么用
admin
2023-07-28 11:20:10
0

为了让RecyclerView可以在所有的Android版本中都能使用,Android开发团队将RecyclerView定义在support.v7包当中。在使用该控件时需要打开当前Modile的build.gradle文件,然后在dependencies节点中添加依赖库的代码。具体代码如下:
compile 'com.android.support:recyclerview-v7:插入版本号'
添加完成以后需要单击右上角的Sync Now进行同步。同步完成后可以在布局文件中添加RecyclerView控件,语法格式如下:

控制RecyclerView需要一些常用的方法,具体方法如下:
◆ setLayoutManager:设置列表项的布局管理器,LinearLayoutManager为线性布局管理器、GridLayoutManager为网格布局管理器、StaggeredGridLayoutManager为瀑布流网格布局管理器。
◆ setItemAnimator:设置列表项增加或者是删除时的动画,可以使用关键字new创建 DefaultItemAnimator()对象实现系统默认的动画效果。
◆ addItemDecoration:添加列表项分割线。
◆ addOnItemTouchListener:添加列表项的触摸监听器。
◆ removeOnItemTouchListener:移除列表项的触摸监听器。
◆ setAdapter:设置列表项的适配器,使用RecyclerView.Adapter。
RecyclerView.Adapter是为RecyclerView所单独设计的适配器类,RecyclerView.Adapter的相关方法如下:
◆ getItemCount:获取列表项的数目。
◆ onBindViewHolder:绑定列表项中所显示的数据。
◆ onCreateViewHolder:在该方法中可以加载列表item(子项)中的布局文件。
下面通过一个具体的实例演示RecyclerView垂直列表的具体应用。
实例07    模拟QQ消息列表    实例位置:光盘\Code\SL\27\07
视频位置:光盘\Video
在Android Studio中创建Module,名称为“QQMessageList”,具体步骤如下:
(1)打开build.gradle(Module: QQMessageList)文件,然后在该文件中的dependencies节点中添加依赖库的代码。
(2)修改新建Module的res/layout目录下的布局文件activity_main.xml,将默认添加的布局管理器修改为相对布局管理器并将TextView组件删除,然后添加1个RecyclerView组件用于显示消息列表。具体代码如下:

01  
02  
08      
09      
16  

(3)在res/layout目录中创建1个名称为layout_item.xml的布局文件,将默认添加的布局管理器修改为相对布局管理器,首先添加1个ImageView组件用于显示头像的图标,然后添加1个垂直线性布局管理器,在该布局管理器中添加2个TextView组件分别用于显示名称与文字消息。具体代码如下:

01  
02  
08      
09      
16      
22          
23          
30          
31          
39      
40  

(4)在res/values目录中的strings.xml字符串资源文件内添加名字与文字消息,用于显示在列表当中。
(5)在com.mingrisoft包中创建1个名称为Adapter的Java类,首先在该类中创建1个名称为MyViewHolder的内部类并让该类继承自RecyclerView.ViewHolder,在该内部类中获取列表中用于显示名称、头像图标与文字信息的组件。然后让Adapter类继承自RecyclerView.Adapter并且实现相对应的方法。具体代码如下:

01  public class Adapter extends RecyclerView.Adapter {
02      @Override
03      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
04          return null;
05      }
06      @Override
07      public void onBindViewHolder(MyViewHolder holder, int position) {
08      }
09      @Override
10      public int getItemCount() {
11          return 0;
12      }
13      class MyViewHolder extends RecyclerView.ViewHolder {
14          public TextView name, info;              //编号文字
15          public ImageView img;                     //图标
16  
17          //获取相关控件
18          public MyViewHolder(View itemView) {
19              super(itemView);
20              name = (TextView) itemView.findViewById(R.id.name);
21              info = (TextView) itemView.findViewById(R.id.info);
22              img = (ImageView) itemView.findViewById(R.id.img);
23          }
24      }
25  }

(6)创建3个int类型的数组分别用于保存头像的图标资源、名字、文字信息,然后创建3个ArrayList集合分别用于保存数组中的资源文件,最后创建1个Adapter构造方法,在该方法中设置菜单行数与行内图标、名称与文字信息具体代码如下:

01  //图标数组
02  private int[] icons = {
03          R.mipmap.icon_1, R.mipmap.icon_2, R.mipmap.icon_3,
04          R.mipmap.icon_4, R.mipmap.icon_5, R.mipmap.icon_6,
05          R.mipmap.icon_7, R.mipmap.icon_8, R.mipmap.icon_9,
06          R.mipmap.icon_10, R.mipmap.icon_11
07  };
08  //名字数组,引用资源文件中的文字
09  private int[] names = {
10          R.string.name1, R.string.name2, R.string.name3,
11          R.string.name4, R.string.name5, R.string.name6,
12          R.string.name7, R.string.name8, R.string.name9,
13          R.string.name10, R.string.name11
14  };
15  //信息数组
16  private int[] infos = {
17          R.string.info1, R.string.info2, R.string.info3,
18          R.string.info4, R.string.info5, R.string.info6,
19          R.string.info7, R.string.info8, R.string.info9,
20          R.string.info10, R.string.info11
21  };
22  private Context lContext;   //上下文
23  private List listIcon = new ArrayList();   //图标集合
24  private List listName = new ArrayList();   //名称集合
25  private List listInfo = new ArrayList();   //信息集合
26  public Adapter(Context context) {
27      lContext = context;
28      //设置菜单行数与行内图标、名称、信息
29      for (int i = 0; i < 11; i++) {
30          listIcon.add(icons[i]);
31          listName.add(names[i]);
32          listInfo.add(infos[i]);
33      }
34  }

(7)重写MyViewHolder onCreateViewHolder()方法,在该方法中实现获取列表中,每行item的布局文件。修改后代码如下:

01  @Override
02  public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
03      //获取列表中,每行的布局文件
04      View view = LayoutInflater.from(lContext).inflate(R.layout.layout_item, arg0, false);
05      MyViewHolder holder = new MyViewHolder(view);           //
06      return holder;
07  }

(8)重写onBindViewHolder()方法,在该方法中设置列表菜单中item(子项)所显示的内容。修改后代码如下:

01  @Override
02  public void onBindViewHolder(final MyViewHolder holder, int position) {
03      //设置图标
04      holder.img.setBackgroundResource(listIcon.get(position));
05      //设置名称
06      holder.name.setText(listName.get(position));
07      //设置信息
08      holder.info.setText(listInfo.get(position));
09  }``

(9)重写getItemCount()方法,在该方法中实现返回数据集中的项目总数。修改后代码如下:

01  @Override
02  public int getItemCount() {
03      return listIcon.size();
04  }

(10)打开主活动MainActivity.java文件,定义所需要的全局变量,在onCreate()方法中首先获取RecyclerView组件,然后为其设置列表布局管理器,最后为其设置适配器。具体代码如下:

01  public class MainActivity extends AppCompatActivity {
02      private RecyclerView lRecyclerView;     //列表控件
03      private Adapter lAdapter;                //适配器
04      @Override
05      protected void onCreate(Bundle savedInstanceState) {
06          super.onCreate(savedInstanceState);
07          setContentView(R.layout.activity_main);
08          //获取列表控件
09          lRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
10          //设置列表布局管理
11          lRecyclerView.setLayoutManager(new LinearLayoutManager(this));
12          //设置适配器
13          lRecyclerView.setAdapter(lAdapter = new Adapter(this));
14      }
15  }

(10)在工具栏中,找到 下拉列表框,然后单击要运行的应用(这里为QQMessageList),再单击右侧的 运行按钮,运行效果如图27.27所示。
android中RecyclerView怎么用
图27.27  模拟QQ消息列表

相关内容

热门资讯

浙江宣传:“走个面儿”咋就没面... “咱北京两千多万人口,您受累,您走个面儿,把这第一波的票房带起来,咱就有了。”某知名导演的新片首映礼...
辞职声明仅95秒遭质疑,韩国队... 【环球时报综合报道】美加墨世界杯小组赛出局后,韩国队主教练洪明甫当地时间28日在墨西哥的韩国队大本营...
美媒爆料:美军第五舰队总部遭伊... 据美国《华尔街日报》27日报道,其通过对卫星图像、社交媒体视频和五角大楼记录的分析发现,今年2月底至...
英国智库给菲律宾GDP增速“浇... 【环球时报特约记者 叶满】英国经济研究机构凯投宏观发布的最新一期《亚洲经济展望》报告(以下简称“报告...
欧洲持续高温,有华人用冰箱降温... 连日来,欧洲多国迎来罕见极端高温天气,法国、德国、意大利等地气温持续飙升,部分地区突破40摄氏度。受...
伊副外长强调船只须按“伊朗线路... 伊朗外交部副部长加里巴巴迪当地时间29日晚间在接受采访时强调,所有船只均须按照“伊朗线路”通过霍尔木...
委内瑞拉强震已致1719人死亡 当地时间29日,委内瑞拉全国代表大会主席罗德里格斯通报,地震已造成该国1719人死亡,5034人受伤...
铋晟新材料申请氯氧化铋基复合材... 国家知识产权局信息显示,江苏铋晟新材料有限公司申请一项名为“一种氯氧化铋基复合材料及其制备方法和用途...
韩国政府将投资千万亿韩元于AI... 韩国总统李在明29日在总统府青瓦台主持召开会议,公布总额超千万亿韩元的半导体、物理人工智能(AI)和...
以色列防长称以伊可能随时再起冲... △卡茨(资料图)据以色列方面29日消息,以国防部长卡茨当天表示,鉴于复杂的安全局势和在黎巴嫩的军事行...