Android 开发中使用 Recyclerview

Android 开发中 Recyclerview 的使用

Overview

学习自:博客园 CSDN Android 官方文档

Android 呈现数据的方式有很多种,使用自定义控件,使用 ListView,使用Recyclerview.

那么我们今天看一下Android 中 如是使用 Recyclerview


声明依赖性

官方文档所示,我们需要声明以下依赖性:

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.1.0"
    // For control over item selection of both touch and mouse driven selection
    implementation "androidx.recyclerview:recyclerview-selection:1.1.0-beta01"
}

布局文件设置

我们先来看一下源码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tool="http://schemas.android.com/tools"
    android:id="@+id/drawLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    android:orientation="vertical"
    tool:context=".MainPackage.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbarLibrary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#517EB9"
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/Theme.AppCompat.Light"
            app:titleTextColor="#fff" />

        <AutoCompleteTextView
            android:id="@+id/auto2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:text="MultiAutoCompleteTextView" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/LibraryListview"
            class="androidx.appcompat.app.AlertController$RecycleListView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:overScrollMode="never">

        </androidx.recyclerview.widget.RecyclerView>

        <MultiAutoCompleteTextView
            android:id="@+id/multiAutoCompleteTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MultiAutoCompleteTextView" />

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationViewLilbary"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/library_items_menu" />
</androidx.drawerlayout.widget.DrawerLayout>

这样 我们的布局文件就创建完成了。这边不做过多的解释。


活动中使用我们的Recyclerview

我们已经在布局文件中创建好了我们的Recyclerview

接着我们看一下如何使用它吧。

public class LibraryMainActivity extends AppCompatActivity {
    NavigationView navigationView;
    DrawerLayout drawerLayout;
    TextView txtEmail;
    TextView txtName;
    ImageView UserImageView;
    List<String> listImage = new ArrayList<>();
    Toolbar toolbar;
    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;
    List<String> list = new ArrayList<>();
    List<String> SearchNameList = new ArrayList<>();
    AutoCompleteTextView SearchAuto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_library_main);
        //region -实例化基础控件等-
        drawerLayout = findViewById(R.id.drawLayout);
        navigationView = findViewById(R.id.navigationViewLilbary);
        txtEmail = findViewById(R.id.txtEmail);
        txtName = findViewById(R.id.txtName);
        toolbar = findViewById(R.id.toolbarLibrary);
        toolbar.setTitle("欢迎使用图书馆");
        toolbar.setLogo(R.drawable.ic_action_name);
        this.setSupportActionBar(toolbar);
        // endregion
        //region -基础设置-
        toolbar.setOnClickListener(v -> {
            drawerLayout.openDrawer(navigationView);
        });
        GetUserInformation();
        //设置 沉浸式体验
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
        //endregion
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView = findViewById(R.id.LibraryListview);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        int a = 100;
        for (int i = 0; i < a; i++) {
            list.add("第一行代码 - 郭霖\t(第二版)" + String.valueOf(i));
            SearchNameList.add("第一行代码 - 郭霖\t(第二版)" + String.valueOf(i));
        }
        recyclerView.setAdapter(new RecyclerViewAdapter(LibraryMainActivity.this, list));
        SearchAuto = findViewById(R.id.auto2);
        SearchAuto.setAdapter(new ArrayAdapter<>(LibraryMainActivity.this, android.R.layout.simple_spinner_dropdown_item, SearchNameList));
    }

    /**
      *@ClassName:LibraryMainActivity - 用于获取 当前登录用户的个人信息,头像等。
      *@author:CaoJiaHao
      *@Param:
     **/
    void GetUserInformation() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String ImageString = Global.HttpGet("UserInformations/" + SessionClass.userClass.get(0).getUserId(), null);
                listImage = UserImageJSON.modelJson(ImageString);
                String imageString = listImage.get(0);
                final Bitmap Userbitmap = Global.StringToBitmap(imageString);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        View viewHearder = navigationView.inflateHeaderView(R.layout.nav_header);
                        txtName = viewHearder.findViewById(R.id.txtName);
                        txtEmail = viewHearder.findViewById(R.id.txtEmail);
                        UserImageView = viewHearder.findViewById(R.id.UserImageView);
                        txtName.setText("User Name: " + SessionClass.userClass.get(0).getUserName());
                        txtEmail.setText("Email: " + SessionClass.userClass.get(0).getEmail());
                        UserImageView.setImageBitmap(Userbitmap);
                        //处理当前登录这没有头像的情况
                        if (Userbitmap == null || Userbitmap.isRecycled())
                            UserImageView.setImageResource(R.drawable.user_image);
                    }
                });
            }
        }).start();
    }
}

这样我们在活动中使用使用我们的Recyclerview就完成了。
当时我们可以看到,在程序中我们使用到了适配器。
接下来我们就看一下适配器是如何编写的。


android Recyclerview 的适配器

如果之前学过Recyclerview的人可能知道。在Recyclerview中并没有给你封装好的单击事件和长按事件等。那么这就意味着。我们需要自己写。

我们先看一下我们的适配器源码:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<String> mList = new ArrayList<>();
    TextView textView;
    ImageView booksImage;
    public RecyclerViewAdapter(Context mContext, List<String> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.r_view_items, parent, false);
        textView = view.findViewById(R.id.text_view);
        booksImage = view.findViewById(R.id.booksImageView);
        return new ViewHodel(view);
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        textView.setText(mList.get(position));
        holder.itemView.setOnClickListener(v -> {
            Toast.makeText(mContext, "Hello android", Toast.LENGTH_SHORT).show();
        });
        holder.itemView.setOnLongClickListener(v -> {
            View viewInformation = LayoutInflater.from(mContext).inflate(R.layout.book_information, null, false);
            ImageView imageView = viewInformation.findViewById(R.id.booksInformationImageView);
            TextView txtName = viewInformation.findViewById(R.id.txtBookName);
            txtName.setText(textView.getText());
            Bitmap bitmap = ((BitmapDrawable) booksImage.getDrawable()).getBitmap();
            imageView.setImageBitmap(bitmap);
            AlertDialog dialog = new AlertDialog.Builder(mContext).setView(viewInformation).show();
            return true;
        });
    }
    @Override
    public int getItemCount() {
        return mList.size();
    }
}
class ViewHodel extends RecyclerView.ViewHolder {
    private TextView txtName;
    public ViewHodel(@NonNull View itemView) {
        super(itemView);
        txtName = itemView.findViewById(R.id.text_view);
    }
}

然后我们根据源码来看一下:

  1. 我们创建一个RecyclerviewAdapter并且继承于RecyclerView.Adapter<RecyclerView.ViewHolder>
  2. 然后我们创建一个集合,调用活动的Context
  3. 然后我们创建了我们的构造函数。
  4. 如果我么正确的继承了我们的对应函数,我们需要重写 我们的 onCreateViewHolder方法。
  5. 这边我们需要加载我们的自定义Items布局。
  6. 然后这边我直接将我们的控件初始换完成了。当时我不知道对不对。
  7. 接着就是我们的onBindViewHolder方法了。这边我注册了部分的点击事件。
  8. 最后是我们的getItemCount();的方法了。他的主要用途返回我们的items数量。
    这样我觉得我已经完成了。


看一下效果:



这篇可能不太对因为个人工作问题,在开发中不会去使用任何依赖。所以这篇只是拓展视野而已。??

原文地址:https://www.cnblogs.com/cao-1/p/12089599.html

时间: 2024-10-11 07:17:23

Android 开发中使用 Recyclerview的相关文章

Android 开发中的日常积累

欢迎Star,Fork https://github.com/lizhangqu/CoreLink 里面记录了开发过程中有用的东西,欢迎补充,不定时更新. Android 性能优化 Android内存优化之OOM Android最佳性能实践(1):合理管理内存 Android最佳性能实践(2):分析内存的使用情况 Android最佳性能实践(3):高性能编码优化 Android最佳性能实践(4):布局优化技巧 Android 加固与反编译 Apktool dex2jar DecompileApk

MVP模式在Android开发中的最佳实践

这篇文章拖了好久了,一直存在草稿箱里没有继续写,趁今天有空,撸撸完. 回想一下,你刚刚学习Android的时候,总会看到一些书上写着,Android使用的是MVC模式,Activity就是一个Controller,或许那个时候,你没有什么深刻的体会.随着经验的积累.你发现,Activity既是Controller,掌管着许许多多的业务逻辑,同时它也作为View的一部分,控制着视图层的显示.久而久之,这个Controller便显得过于重,职责不再那么单一. 于是,再后来,为了使Activity的职

Android开发中常见的设计模式

对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的同学,这里推荐2本书.一本是Head First系列的Head Hirst Design Pattern,英文好的可以看英文,可以多读几遍.另外一本是大话设计模式. 单例模式 首先了解一些单例模式的概念. 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这样做有以下几个优点 对于

android开发中碰到的三个小问题

Android开发中注意到的几个问题 1.  关于actionbar 初始化配置actionbar,getactionbar经常为null,原因是因为在源码或者布局文件中设置了全屏显示的缘故,不设置全屏显示就不会有问题. 2.  关于textview Textview默认是没有焦点的,因此不可能有点击事件,也无法直接实现背景的selector.通过设置android:clickable = true;就可以了,这一点与Button有很大的不同 3.  关于sourcinsight中的php代码.

android开发中监听器的三种实现方法(OnClickListener)

Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v)). 二.监听器的三种实现方法 (以OnClickListener为例) 方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener

android开发中,两个按下手机实体返回键,两个Activity反复来回跳转的问题

android开发中,对于用intent实现跳转的Ativity,有时候按下手机的返回键时,两个Activity之间会多次相互跳转,始终退出不了程序的情况.这是由于从Activity  A跳转到Activity  B时,A被压入Activity栈中:当从B返回时,默认又重新创建了一个Activity A对象,这样一来就有了多个Activity A对象.所以造成了无法退出情况. 解决办法是:在AndroidManifest.xml文件中找到Activity A项,在其属性中加入  android:

Android开发中常用的ListView列表的优化方式ViewHolder

在Android开发中难免会遇到大量的数据加载到ListView中进行显示, 然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需 求变化ListView'条目中的内容是越来越多这就需要程序员来自定义适配器, 而关键的就是适配器的优化问题,适配器没有优化好往往就会造成OOM (内存溢出)或者是滑动卡顿之类的问题,接下来我就给大家介绍一种常 用的Adapter优化方法 1 /** 2 * list View的适配器 3 */ 4 class Adapter extends Bas

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

android权限--android开发中的权限及含义(上)

android权限--android开发中的权限及含义(上) android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC Dream不包含闪光灯 android.pe