Android RecycleView的使用方法(小白也能懂,手把手教學,超詳細)

1. 成品快速一覽

項目源碼已經上傳到Gitee碼雲了(國內的GitHub,訪問與下載速度極快,無需龜速等待),戳這裏

成品做成了瀑布流的形式,一行代碼就可以搞定一列顯示幾行,類似於淘寶京東的商品顯示,隨心切換。
在這裏插入圖片描述

2.項目前準備

做軟件和做菜是一樣的,先準備好一些材料,這樣做菜的時候隨手就能下鍋。

2.1 新鮮的菜——最最最最新版本的Android Studio (2020年6月 目前是3.6,如有更新請下載最新版)

最新版本的Android Studio摒棄了老舊雜亂的各種包,一個AndroidX一把梭,什麼AndroidV4、V7都不用了。
在這裏插入圖片描述

2.2 美味調料——美觀的圖片與Icon

在這裏插入圖片描述在這裏插入圖片描述 在這裏插入圖片描述

3. 項目開始

3.1 起鍋燒油——新建一個空項目

在這裏插入圖片描述
在這裏插入圖片描述

3.2 下料翻炒——新建一個Layout佈局文件,下載RecycleView組件

因爲RecycleView不是默認就存在的基本組件,我們需要在layout佈局文件中下載,無需代碼,點點鼠標就行了
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
RecycleView旁邊會有一個向下的箭頭,點擊確認下載就可以直接用了。

佈局代碼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

</RelativeLayout>

3.3 撈起再放入新的料——item佈局

item從名字來看,就知道是RecycleView中顯示的項目了,我們預期的佈局應該是長這個樣子的,如下圖:
在這裏插入圖片描述
item佈局代碼:看似有點多,其實就是簡單的圖片搭配文字,設計一些間距,其實很簡單,你也可以根據自己的喜好搭配。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="10dp">
    <ImageView
        android:id="@+id/food1"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@drawable/food1"
        />

    <TextView
        android:id="@+id/text1"
        android:layout_below="@id/food1"
        android:lines="2"
        android:ellipsize="end"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:gravity="center"
        android:text="奧爾良雞腿,美味鮮香烤制"
        />
    <ImageView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:src="@drawable/profile"
        android:layout_below="@id/text1"
        android:id="@+id/profile"
        />

    <TextView
        android:id="@+id/author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/profile"
        android:text="樂樂愛喫飯"
        android:layout_marginLeft="10dp"
        android:layout_below="@id/text1"/>
    <ImageView
        android:id="@+id/love"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:src="@drawable/love"
        android:layout_below="@id/text1"
        android:layout_toLeftOf="@id/loveNum"
        />
    <TextView
        android:id="@+id/loveNum"
        android:layout_below="@id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="7K"
        android:layout_alignParentRight="true"
        />

</RelativeLayout>

佈局的細節大家可以自己掌控,比如超出2行的字體就設置爲省略號,代碼與圖見下方。

 		android:lines="2"
        android:ellipsize="end"

在這裏插入圖片描述

3.3.下入主食——MainActivity.java代碼(註釋在下方)

package com.example.test1;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.OrientationHelper;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private List<String> list;
    private RecycleAdapterDome adapterDome;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recycler_view);
        list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add("奧爾良雞腿"+i+",美味鮮香,快來試試!便宜實惠又健康,還在等待什麼呢!!!!");
        }
        adapterDome = new RecycleAdapterDome(this,list);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        StaggeredGridLayoutManager stagger = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(stagger);
        recyclerView.setAdapter(adapterDome);
    }
    }

上述代碼,先獲取佈局文件中的RecycleView:

recyclerView = findViewById(R.id.recycler_view);

設置RecycleView顯示爲2列,垂直顯示:

  StaggeredGridLayoutManager stagger = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

RecycleView是用來顯示數據的,我們來自定義一個數據集(正常情況下是從數據庫或者服務器上獲取的,這裏爲了方便演示簡單自做一個數據集)

list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add("奧爾良雞腿"+i+",美味鮮香,快來試試!便宜實惠又健康,還在等待什麼呢!!!!");
        }

有了RecycleView、數據集,還缺什麼呢?當然是數據適配器(Adapter)

recyclerView.setAdapter(adapterDome);

3.4 加入佐料——自定義數據適配器

RecycleAdapterDemo.java:

package com.example.test1;

import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class RecycleAdapterDome extends RecyclerView.Adapter<RecycleAdapterDome.MyViewHolder> {
    private Context context;
    private List<String> list;
    private View inflater;

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView textView;
        public MyViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.text1);
        }
    }

    //構造方法,傳入數據
    public RecycleAdapterDome(Context context, List<String> list){
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public RecycleAdapterDome.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //創建ViewHolder,返回每一項的佈局
        inflater = LayoutInflater.from(context).inflate(R.layout.item1,parent,false);
        MyViewHolder myViewHolder = new MyViewHolder(inflater);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecycleAdapterDome.MyViewHolder holder, int position) {
        //將數據和控件綁定
        holder.textView.setText(list.get(position));
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

}

RecycleView的數據適配器有點講究,需要繼承自 RecyclerView.Adapter,而且還要填入泛型數據——ViewHolder的名字

public class RecycleAdapterDome extends RecyclerView.Adapter<RecycleAdapterDome.MyViewHolder> {}

創建內部類ViewHolder負責對控件進行處理,佈局中的控件都在這裏進行初始化和管理:

   class MyViewHolder extends RecyclerView.ViewHolder{
        TextView textView;
        public MyViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.text1);
        }
    }

繼承自 RecyclerView.Adapter的類需要重寫3個方法,分別是:

1.初始化創建視圖處理器

public RecycleAdapterDome onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {}

若指定了ViewHolder的名字,改動如下:

 public RecycleAdapterDome.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {}

在視圖處理器中,綁定要顯示的item的佈局文件,這樣數據就會在屏幕上顯示出來了

 inflater = LayoutInflater.from(context).inflate(R.layout.item1,parent,false);

2.綁定內部控件,控件的具體操作都在這裏面管理

public void onBindViewHolder(@NonNull RecycleAdapterDome.MyViewHolder holder, int position) {}

3.獲取item的總數目

    public int getItemCount() {}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章