zoukankan      html  css  js  c++  java
  • Android教程2020

    本文链接
    本文介绍RecyclerView的使用入门。这里给出一种比较常见的使用方式。

    Android教程2020 - 系列总览

    想必读者朋友对列表的表现形式已经不再陌生。手机上有联系人列表,文件列表,短信列表等等。
    本文讲述的是在Android开发中用RecyclerView来实现列表效果。

    使用步骤

    引入RecyclerView

    在app的build.gradle文件中添加引用。我们使用的是androidx包。

    dependencies {
        // ...
        implementation 'androidx.recyclerview:recyclerview:1.1.0'
    }
    

    数据准备

    先确定一下要显示什么样的数据。是用户信息,联系人,或是文件。这里以字符为例。
    写代码前,我们先考虑一下需求,就是要如何显示,怎么显示数据。日常工作中,一般会有UI效果图。本文中的美术设计就由我们自己发挥了。

    比如显示 a 97

    ViewHolder与layout

    现在要显示的数据已经确定了。来设计UI表现。layout与ViewHolder紧密相关。在设计Adapter类前,先写ViewHolder类会比较好。

    新建定义item(列表子项)的布局文件item_letter.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000" />
    
        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000" />
    
    </LinearLayout>
    

    这里使用内部类,把ViewHolder类写在activity类里面。

        private class VH extends RecyclerView.ViewHolder {
            TextView tv1;
            TextView tv2;
    
            public VH(@NonNull View itemView) {
                super(itemView);
                tv1 = itemView.findViewById(R.id.tv1);
                tv2 = itemView.findViewById(R.id.tv2);
            }
        }
    

    从上面可以看出,ViewHolder和item的layout是紧密相关的。
    layout里面的id写的比较简单。实际项目中可以给一些更有意义的id命名。

    在activity的layout中,添加RecyclerView。

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/re_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    

    设计Adapter

    设计一个适配器继承自RecyclerView.Adapter<VH>。这里的VH是我们上面写好的ViewHolder。
    LetterAdapter中持有它自己的数据列表。需要实现3个方法。

    onCreateViewHolder方法,要求返回VH对象。这里就是创建VH对象并返回。
    而VH构造器要求传入一个View,我们利用LayoutInflater创建一个view给它。当然,创建的根据就是前面设计好的item_letter

    onBindViewHolder是把数据交给对应的VH来显示。

    getItemCount方法要求返回数据的数量。

        private class LetterAdapter extends RecyclerView.Adapter<VH> {
    
            private List<Character> dataList;
    
            public LetterAdapter(List<Character> dataList) {
                this.dataList = dataList;
            }
    
            @NonNull
            @Override
            public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                return new VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_letter, parent, false));
            }
    
            @Override
            public void onBindViewHolder(@NonNull VH holder, int position) {
                Character c = dataList.get(position);
                holder.tv1.setText(c.toString());
                holder.tv2.setText(String.valueOf(Integer.valueOf(c)));
            }
    
            @Override
            public int getItemCount() {
                return dataList.size();
            }
        }
    

    粗心大意的时候,可能会忘记初始化adapter里的dataList。报一个null pointer异常。

    设置RecyclerView

    在Activity的onCreate方法里进行了初始化。
    RecyclerView需要2项设置,适配器与LayoutManager。适配器就是我们上面定的那个。
    LayoutManager这里用LinearLayoutManager,指定为垂直方向,这样我们会得到一个上下滑动的列表。

            List<Character> characterList = new ArrayList<>();
            for (char c = 'a'; c <= 'z'; c++) {
                characterList.add(c);
            }
    
            mLetterAdapter = new LetterAdapter(characterList);
            RecyclerView letterReView = findViewById(R.id.re_view);
            letterReView.setAdapter(mLetterAdapter);
            letterReView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
    
    

    观察运行结果

    运行到手机或者模拟器上,打开这个activity。有的朋友就发现,为啥屏幕里一个子项item就占满了整个屏幕?
    因为我们前面设置的item占满屏幕。回到item_letter.xml,看一下根layout的设置。
    layout_height="match_parent"里的设置改为wrap_content
    重新编译运行一下再看看结果。

    也可以给根layout设置固定的高度。具体视美术设计和需求而定。

    小结

    到这里我们掌握了RecyclerView的基本使用方式。
    接下来还要了解如何自定义它的表现形式。例如点击或长按item的反应;item之间添加分割线;增/删/改数据;使用瀑布流样式等等。
    RecyclerView使用了适配器模式

    可以参考官方的RecyclerView文档

    工程放这里: https://github.com/AnRFDev/Tutorial2020

    相关阅读
    RecyclerView - 使用入门
    RecyclerView点击事件 - 如何设置点击事件
    RecyclerView示例 - 实际使用
    RecyclerView获取滑动距离
    RecyclerView显示多种item

  • 相关阅读:
    优化你的手机游戏
    vuforia 结合 unity3d 开发 AR 的 androidAPP 总结
    self._raiseerror(v) File "D:GameDevelopmentPython27libxmletreeElementTree.py", line 1506, in _raiseerror
    自定义TexturePacker插件导出自己的plist文件
    还原TexturePacker plist 文件以及图片的方法 (切开各小图片)
    no module named firefly.master.master
    c#比较器 排序
    python ——面向对象进阶(反射,双下线方法,静态方法,类方法)
    python——模块和包 需要注意的地方
    举例详解Python中的split()函数的使用方法
  • 原文地址:https://www.cnblogs.com/rustfisher/p/12254732.html
Copyright © 2011-2022 走看看