Android RecyclerView使用详解(含通过网络请求得到数据) ...

打印 上一主题 下一主题

主题 972|帖子 972|积分 2916

RecyclerView概述

RecyclerView是Android中非常受接待的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替换传统的ListView和GridView列表控件,以是如果你还在使用ListView的话可以替换为RecyclerView了。
对于RecyclerView的使用根据现实项目进行说明,一些功能大概是你现在正在做的,对你有帮助也说不定。
 
一、RecyclerView底子使用

第一步:在build.gradle中添加依靠

  1. implementation ("androidx.recyclerview:recyclerview:1.1.0")//可横向滚动
复制代码
第二步:添加RecyclerView

点开一个结构文件,找到RecyclerView控件,拖动到要添加的位置即可添加RecyclerView。

xml代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">
  8.     <androidx.constraintlayout.widget.ConstraintLayout
  9.         android:id="@+id/constraintLayout"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="40dp"
  12.         android:layout_marginTop="1dp"
  13.         android:background="#6750A4"
  14.         app:layout_constraintEnd_toEndOf="parent"
  15.         app:layout_constraintStart_toStartOf="parent"
  16.         app:layout_constraintTop_toTopOf="parent">
  17.         <TextView
  18.             android:id="@+id/textView"
  19.             android:layout_width="wrap_content"
  20.             android:layout_height="wrap_content"
  21.             android:text="实例"
  22.             android:textColor="#FFFFFF"
  23.             android:textSize="16sp"
  24.             app:layout_constraintBottom_toBottomOf="parent"
  25.             app:layout_constraintEnd_toEndOf="parent"
  26.             app:layout_constraintStart_toStartOf="parent"
  27.             app:layout_constraintTop_toTopOf="parent" />
  28.     </androidx.constraintlayout.widget.ConstraintLayout>
  29.     <androidx.constraintlayout.widget.ConstraintLayout
  30.         android:layout_width="409dp"
  31.         android:layout_height="688dp"
  32.         android:layout_marginTop="1dp"
  33.         app:layout_constraintEnd_toEndOf="parent"
  34.         app:layout_constraintStart_toStartOf="parent"
  35.         app:layout_constraintTop_toBottomOf="@+id/constraintLayout">
  36.         <androidx.recyclerview.widget.RecyclerView
  37.             android:id="@+id/recycleview"
  38.             android:layout_width="409dp"
  39.             android:layout_height="688dp"
  40.             app:layout_constraintEnd_toEndOf="parent"
  41.             app:layout_constraintStart_toStartOf="parent"
  42.             app:layout_constraintTop_toTopOf="parent" />
  43.     </androidx.constraintlayout.widget.ConstraintLayout>
  44. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
第三步:再添加一个news_item_layout.xml的结构文件,用于显示一条数据


在根结构上面设置好每条显示的数据的长宽,并添加内容到根结构内里。
代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="90dp">
  7.     <TextView
  8.         android:id="@+id/textView2"
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"
  11.         android:layout_marginStart="16dp"
  12.         android:layout_marginTop="16dp"
  13.         android:text="title"
  14.         android:textColor="#000000"
  15.         android:textSize="18sp"
  16.         app:layout_constraintStart_toStartOf="parent"
  17.         app:layout_constraintTop_toTopOf="parent" />
  18.     <TextView
  19.         android:id="@+id/textView3"
  20.         android:layout_width="wrap_content"
  21.         android:layout_height="wrap_content"
  22.         android:layout_marginStart="16dp"
  23.         android:layout_marginTop="5dp"
  24.         android:text="content"
  25.         android:textColor="#707070"
  26.         app:layout_constraintStart_toStartOf="parent"
  27.         app:layout_constraintTop_toBottomOf="@+id/textView2" />
  28. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
 

第四步:添加逻辑代码

界说一个实体类:

实体类代码如下:
  1. public class News {
  2.     public String title; // 标题
  3.     public String content; //内容
  4. }
复制代码
然后在MainActivity中界说内部类 ViewHolder类、 MyAdapter类以及设置RecyclerView相关逻辑
首先是内部类 MyViewHolder类:用于初始化控件
  1. class MyViewHoder extends RecyclerView.ViewHolder {
  2.         TextView title;
  3.         TextView content;
  4.         public MyViewHoder(@NonNull View itemView) {
  5.             super(itemView);
  6.             title = itemView.findViewById(R.id.textView2);
  7.             content = itemView.findViewById(R.id.textView3);
  8.         }
  9.     }
复制代码
再就是内部类 MyAdapter类:将添加到的数据与item进行绑定
  1. class MyAdapter extends RecyclerView.Adapter<MyViewHoder> {
  2.         //绑定item布局
  3.         @NonNull
  4.         @Override
  5.         public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  6.             View view = View.inflate(MainActivity.this, R.layout.news_item_layout, null);
  7.             MyViewHoder myViewHoder = new MyViewHoder(view);
  8.             return myViewHoder;
  9.         }
  10.         //给item添加数据
  11.         @Override
  12.         public void onBindViewHolder(@NonNull MyViewHoder holder, int position) {
  13.             News news = newsList.get(position);
  14.             holder.title.setText(news.title);
  15.             holder.content.setText(news.content);
  16.         }
  17.         //设置item条数
  18.         @Override
  19.         public int getItemCount() {
  20.             return newsList.size();
  21.         }
  22.     }
复制代码
最后就是构造数据: 
  1. protected void onCreate(Bundle savedInstanceState) {
  2.         super.onCreate(savedInstanceState);
  3.         setContentView(R.layout.activity_main);
  4.         mRecyclerView = findViewById(R.id.recycleview);
  5.         // 构造一些数据
  6.         for (int i = 0; i < 100; i++) {
  7.             News news = new News();
  8.             news.title = "标题" + i;
  9.             news.content = "内容" + i;
  10.             newsList.add(news);
  11.         }
  12.         mMyAdapter = new MyAdapter();
  13.         mRecyclerView.setAdapter(mMyAdapter);
  14.         LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
  15.         mRecyclerView.setLayoutManager(layoutManager);
  16.     }
复制代码
完备 MainActivity.java 代码: 
  1. package com.example.retrofit;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    RecyclerView mRecyclerView;    MyAdapter mMyAdapter ;    List<News> newsList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mRecyclerView = findViewById(R.id.recycleview);        // 构造一些数据        for (int i = 0; i < 50; i++) {            News news = new News();            news.title = "标题" + i;            news.content = "内容" + i;            newsList.add(news);        }        mMyAdapter = new MyAdapter();        mRecyclerView.setAdapter(mMyAdapter);        LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);        mRecyclerView.setLayoutManager(layoutManager);    }    class MyAdapter extends RecyclerView.Adapter<MyViewHoder> {
  2.         //绑定item布局
  3.         @NonNull
  4.         @Override
  5.         public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  6.             View view = View.inflate(MainActivity.this, R.layout.news_item_layout, null);
  7.             MyViewHoder myViewHoder = new MyViewHoder(view);
  8.             return myViewHoder;
  9.         }
  10.         //给item添加数据
  11.         @Override
  12.         public void onBindViewHolder(@NonNull MyViewHoder holder, int position) {
  13.             News news = newsList.get(position);
  14.             holder.title.setText(news.title);
  15.             holder.content.setText(news.content);
  16.         }
  17.         //设置item条数
  18.         @Override
  19.         public int getItemCount() {
  20.             return newsList.size();
  21.         }
  22.     }    class MyViewHoder extends RecyclerView.ViewHolder {
  23.         TextView title;
  24.         TextView content;
  25.         public MyViewHoder(@NonNull View itemView) {
  26.             super(itemView);
  27.             title = itemView.findViewById(R.id.textView2);
  28.             content = itemView.findViewById(R.id.textView3);
  29.         }
  30.     }}
复制代码
 
若要实现横向滑动:在 MainActivity.java 添加一句如下代码
  1. layoutManager.setOrientation(RecyclerView.HORIZONTAL);
复制代码

 
若要每行显示多条数据,可对代码做如下修改:
  1. mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3));//每行三个
复制代码

 运行结果如下:

 
二、RecyclerView进阶使用:通过网络请求得到数据

前期预备:添加依靠包:
  1. implementation("com.squareup.okhttp3:okhttp:4.11.0")
  2. implementation ("com.squareup.retrofit2:retrofit:2.9.0")
  3. implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
  4. implementation ("io.github.youth5201314:banner:2.2.3")
  5. implementation ("com.github.bumptech.glide:glide:4.15.1")
  6. implementation ("com.google.code.gson:gson:2.10.1")
复制代码
添加网络请求权限:
  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  2. android:allowBackup="true"
复制代码

添加一些数据到mock中去(useMock 免费在线Mock平台 Api数据模拟助手)
重新构造实体类:

获取网络数据,将网络数据赋值给newsDTOList数组
  1. // 构造一些数据
  2.         Request request = new Request.Builder()
  3.                 .url("https://detail.usemock.com/shiyan")
  4.                 .get().build();
  5.         OkHttpClient okHttpClient = new OkHttpClient();
  6.         Call call = okHttpClient.newCall(request);
  7.         //构造item数据
  8.         call.enqueue(new Callback() {
  9.             @Override
  10.             public void onFailure(@NonNull Call call, @NonNull IOException e) {
  11.             }
  12.             @Override
  13.             public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  14.                 String result = response.body().string();
  15.                 MainActivity.this.runOnUiThread(new Runnable() {
  16.                     @Override
  17.                     public void run() {
  18.                         try {
  19.                             Gson gson = new Gson();
  20.                             News news = gson.fromJson(result,News.class);
  21.                             newsDTOList.addAll(news.news);
  22.                             mMyAdapter.notifyDataSetChanged();
  23.                         }catch (Exception e){
  24.                             throw new RuntimeException(e);
  25.                         }
  26.                     }
  27.                 });
  28.             }
  29.         });
复制代码
再对MainActivity中界说内部类 ViewHolder类、 MyAdapter类以及设置RecyclerView相关逻辑的修改。具体操纵很简朴,这里省略,下面是完备的代码,供参考:
MainActivity.java代码:
  1. import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.DividerItemDecoration;import androidx.recyclerview.widget.GridLayoutManager;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import com.google.gson.Gson;import java.io.IOException;import java.util.ArrayList;import java.util.List;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MainActivity extends AppCompatActivity {    RecyclerView mRecyclerView;    MyAdapter mMyAdapter ;    List<News.NewsDTO> newsDTOList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mRecyclerView = findViewById(R.id.recycleview);        DividerItemDecoration mDivider = new                DividerItemDecoration(this, DividerItemDecoration.VERTICAL);        mRecyclerView.addItemDecoration(mDivider);        // 构造一些数据
  2.         Request request = new Request.Builder()
  3.                 .url("https://detail.usemock.com/shiyan")
  4.                 .get().build();
  5.         OkHttpClient okHttpClient = new OkHttpClient();
  6.         Call call = okHttpClient.newCall(request);
  7.         //构造item数据
  8.         call.enqueue(new Callback() {
  9.             @Override
  10.             public void onFailure(@NonNull Call call, @NonNull IOException e) {
  11.             }
  12.             @Override
  13.             public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
  14.                 String result = response.body().string();
  15.                 MainActivity.this.runOnUiThread(new Runnable() {
  16.                     @Override
  17.                     public void run() {
  18.                         try {
  19.                             Gson gson = new Gson();
  20.                             News news = gson.fromJson(result,News.class);
  21.                             newsDTOList.addAll(news.news);
  22.                             mMyAdapter.notifyDataSetChanged();
  23.                         }catch (Exception e){
  24.                             throw new RuntimeException(e);
  25.                         }
  26.                     }
  27.                 });
  28.             }
  29.         });        mMyAdapter = new MyAdapter();        mRecyclerView.setAdapter(mMyAdapter);        //mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3));//每行三个
  30.         LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);        //layoutManager.setOrientation(RecyclerView.HORIZONTAL);
  31.         mRecyclerView.setLayoutManager(layoutManager);    }    class MyAdapter extends RecyclerView.Adapter<MyViewHoder> {        //绑定item结构        @NonNull        @Override        public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {            View view = View.inflate(MainActivity.this, R.layout.news_item_layout, null);            MyViewHoder myViewHoder = new MyViewHoder(view);            return myViewHoder;        }        //给item添加数据        @Override        public void onBindViewHolder(@NonNull MyViewHoder holder, int position) {            News.NewsDTO newsDTO = newsDTOList.get(position);            holder.title.setText(newsDTO.title);            Glide.with(MainActivity.this).load(newsDTO.content).into(holder.content);        }        //设置item条数        @Override        public int getItemCount() {            return newsDTOList.size();        }    }    class MyViewHoder extends RecyclerView.ViewHolder {        TextView title;        ImageView content;        public MyViewHoder(@NonNull View itemView) {            super(itemView);            title = itemView.findViewById(R.id.textView2);            content = itemView.findViewById(R.id.imageView);        }    }}
复制代码
activity_main.xml代码:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">
  8.     <androidx.constraintlayout.widget.ConstraintLayout
  9.         android:id="@+id/constraintLayout"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="40dp"
  12.         android:layout_marginTop="1dp"
  13.         android:background="#6750A4"
  14.         app:layout_constraintEnd_toEndOf="parent"
  15.         app:layout_constraintStart_toStartOf="parent"
  16.         app:layout_constraintTop_toTopOf="parent">
  17.         <TextView
  18.             android:id="@+id/textView"
  19.             android:layout_width="wrap_content"
  20.             android:layout_height="wrap_content"
  21.             android:text="实例"
  22.             android:textColor="#FFFFFF"
  23.             android:textSize="16sp"
  24.             app:layout_constraintBottom_toBottomOf="parent"
  25.             app:layout_constraintEnd_toEndOf="parent"
  26.             app:layout_constraintStart_toStartOf="parent"
  27.             app:layout_constraintTop_toTopOf="parent" />
  28.     </androidx.constraintlayout.widget.ConstraintLayout>
  29.     <androidx.constraintlayout.widget.ConstraintLayout
  30.         android:layout_width="409dp"
  31.         android:layout_height="688dp"
  32.         android:layout_marginTop="1dp"
  33.         app:layout_constraintEnd_toEndOf="parent"
  34.         app:layout_constraintStart_toStartOf="parent"
  35.         app:layout_constraintTop_toBottomOf="@+id/constraintLayout">
  36.         <androidx.recyclerview.widget.RecyclerView
  37.             android:id="@+id/recycleview"
  38.             android:layout_width="409dp"
  39.             android:layout_height="688dp"
  40.             app:layout_constraintEnd_toEndOf="parent"
  41.             app:layout_constraintStart_toStartOf="parent"
  42.             app:layout_constraintTop_toTopOf="parent" />
  43.     </androidx.constraintlayout.widget.ConstraintLayout>
  44. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
News.java代码:
  1. import java.util.List;
  2. public class News {
  3.     @com.google.gson.annotations.SerializedName("news")
  4.     public List<NewsDTO> news;
  5.     public static class NewsDTO {
  6.         @com.google.gson.annotations.SerializedName("title")
  7.         public String title;
  8.         @com.google.gson.annotations.SerializedName("content")
  9.         public String content;
  10.     }
  11. }
复制代码
 news_item_layout.xml代码:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="200dp"
  6.     android:layout_height="150dp">
  7.     <TextView
  8.         android:id="@+id/textView2"
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"
  11.         android:layout_marginStart="16dp"
  12.         android:layout_marginTop="16dp"
  13.         android:text="title"
  14.         android:textColor="#000000"
  15.         android:textSize="18sp"
  16.         app:layout_constraintStart_toStartOf="parent"
  17.         app:layout_constraintTop_toTopOf="parent" />
  18.     <ImageView
  19.         android:id="@+id/imageView"
  20.         android:layout_width="100dp"
  21.         android:layout_height="100dp"
  22.         android:layout_marginStart="16dp"
  23.         android:layout_marginTop="8dp"
  24.         app:layout_constraintStart_toStartOf="parent"
  25.         app:layout_constraintTop_toBottomOf="@+id/textView2"
  26.         app:srcCompat="@drawable/ic_launcher_background" />
  27. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
运行结果:

 
如有不清楚,或者本文章中有错误的地方,本人客气接受指正。

下一期:Android Studio动画结果的使用详解

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表