主頁 > 移動端開發 > RecyclerView簡單使用(非常詳細)

RecyclerView簡單使用(非常詳細)

2021-04-26 10:14:04 移動端開發

星期六,又是擼代碼的一天
作為一個初級都算不上的小白,一步一個腳印的學吧,學一個記一個
今天記錄的是RecyclerView

RecyclerView

  • 簡述
  • 創建布局
    • 添加 RecyclerView和每個list布局(偏新手向,選擇性跳過)
  • 創建配接器
      • 創建
      • onCreateViewHolder()
      • onBindViewHolder()
      • getItemCount()
  • 系結配接器
      • 創建假資料
      • 系結配接器
  • 配接器調整
      • 區別顯示的實作
  • 點擊事件

簡述

官方解釋為:提供一個固定的View讓有限的視窗顯示一個大資料集,(抄的)
我的理解是,和ListView差不多的東西
ListView是什么,不知道
總之,它可以呈現一系列資料,呈現方式可以根據給的LayoutManager確定

瀑布流(StaggeredGridLayoutManager)
在這里插入圖片描述

串列流 (LinearLayoutManager)

在這里插入圖片描述

表格流(GridLayoutManager)
在這里插入圖片描述

使用方式在下面的 系結配接器

創建布局

添加 RecyclerView和每個list布局(偏新手向,選擇性跳過)

第一步當然是在xml中添加,在Palette中找到RecyclerView,右鍵Add添加
在這里插入圖片描述
又或者在布局中寫入Recy選擇
在這里插入圖片描述
這時需要給RecyclerView添加id

android:id="@+id/recycler"

然后根據開發需求,創建一個xml檔案,我這里命名為recy_list.xml
作為單個list的布局,我這里模仿聊天界面做了個xml
在這里插入圖片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#cccccc"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:paddingRight="20dp"
    android:paddingLeft="20dp">


    <ImageView
        android:id="@+id/head"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:src="@android:mipmap/sym_def_app_icon" />


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

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="小白"
            android:textColor="@color/black"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/news"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:textColor="#666666"
            android:text="今天搬了多少磚"/>

    </LinearLayout>

    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end"
        android:textColor="#999999"
        android:textSize="14sp"
        android:text="2021年4月24日\n19:02:50"/>

</LinearLayout>

最后在Activity系結等等一系列操作

public class MainActivity extends AppCompatActivity {
 private RecyclerView recycler;//創建
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化控制元件方法
    }

    private void initView() {
        recycler = findViewById(R.id.recycler);//系結RecyclerView
    }

接下來進入重點,配接器

創建配接器

適配器Adapter,可以讓開發者自定義recyclerview系結的資料,通過上面創建的recy_list檔案模板來創建一堆item

創建

  1. 創建一個Adapter類
  2. 繼承RecyclerView的Adapte
  3. 泛型定義為Adapter的內部類MyHolder

具體是什么我也不知道,一堆復雜的詞
大概就是這樣

public class Adapter extends RecyclerView.Adapter<Adapter.MyHolder>  {
	@NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull Adapter.MyHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}

然后Alt+回車生成一堆Adapter的介面,同時MyHolder變紅,這個不管它,先來看這三方法干啥的

onCreateViewHolder()

  • 創建ViewHolder時的回呼函式
  • 傳入 ViewGroup parent 和 int viewType
  • 回傳 MyHolder

MyHolder是list中每個item
這里使用LayoutInflater布局加載器來加載view,再將view傳給內部類MyHolder用于實體化

    private View view;//在外面定義一個view
    
	@NonNull
    @Override
    public Adapter.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
          view = LayoutInflater.from(context)//實體化LayoutInflater
                //傳參 剛才創建的recy_list.xml
                .inflate(R.layout.recy_list, parent, false);
        Adapter.MyHolder myHolder= new Adapter.MyHolder(view);
        return myHolder;
    }

(要傳contect,挖坑)
來說一下LayoutInflater,菜鳥教程的解釋 LayoutInflater(布局服務)
在這里插入圖片描述

然后創建一個內部類MyHolder,繼承ViewHolder ,在里面加上剛才的xml中的控制元件并系結

  public class MyHolder extends RecyclerView.ViewHolder {
        TextView name, news, time;
        ImageView head;

        public MyHolder(View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.name);
            news = itemView.findViewById(R.id.news);
            time = itemView.findViewById(R.id.time);
            head = itemView.findViewById(R.id.head);
        }
    }

這時,第一個方法解決了!!

onBindViewHolder()

  • 系結ViewHolder時的回呼函式
  • 傳入 自定義內部類的 holder 和 int position

激動人心的時候到了,終于系結資料了

position
可以理解為list中item的下標,就像陣列一樣,每個item都有自己的標識
那資料怎么來,Adapter初始唄
新增構造方法,記得要傳context,順便加上成員變數

private Context context;
private ArrayList<String> nameList,newsList,timeList;

public Adapter(Context context, ArrayList nameList ,ArrayList newsList ,ArrayList timeList) {
        this.context = context;
        this.nameList = nameList;
        this.newsList = newsList;
        this.timeList = timeList;
    }

然后在onBindViewHolder方法中寫系結,根據position來給各個控制元件設定

 @Override
    public void onBindViewHolder(@NonNull ButViewHolder holder, int position) {
        //將資料和控制元件系結
        holder.name.setText(nameList.get(position));
        holder.news.setText(newsList.get(position));
        holder.time.setText(timeList.get(position));
    }

就剩最后一個方法了

getItemCount()

沒有傳參,需要回傳一個int
這個方法是控制創建item的條數,回傳的就是條數
我這里直接給其中一個ArrayList的大小即可

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

三個方法搞定了,意味著這個簡單的Adapter已經寫完了
然后就是讓RecyclerView系結Adapter

系結配接器

在Activity那邊加一個方法,或者直接在onCreate里系結
setRecyclerView();

創建假資料

 ArrayList name = new ArrayList();
        ArrayList news = new ArrayList();
        ArrayList time = new ArrayList();

        for (int i= 0;i<20;i++){
         name.add("小白    " + i);
            news.add("今天搬磚了?");
            time.add("2021年4月24日\n19:17:04");
        }

系結配接器

	//配接器
 	RecyclerAdapter adapter = new RecyclerAdapter(this,name,news,time);
    //布局
    LinearLayoutManager manager = new LinearLayoutManager(this);
    //設定布局
    recycler.setLayoutManager(manager);
    //設定影片
    recycler.setItemAnimator(new DefaultItemAnimator());
    //設定配接器
    recycler.setAdapter(adapter);

就這樣搞定了,這時運行專案就可以了看見本文開頭那個串列流的效果了

配接器調整

都寫到這了,再寫一點吧

區別顯示的實作

假如要給某一條item換上不同的背景
這時就需要在onBindViewHolder中修改
通過position,拿到ArrayList的某個資料進行判斷
然后設定這個holder的某個控制元件的屬性即可

點擊事件

都九點半了,六千字,好累,寫目錄時加了這個,想刪又不想刪,還是寫完再回家吧
Adapter點擊事件的實作,需要宣告View.OnClickListener介面
修改Adapter類,宣告View.OnClickListener介面,加上一個onClick方法

public class Adapter 
	extends RecyclerView.Adapter<Adapter.MyHolder>
 	implements View.OnClickListener{

	@Override
    public void onClick(View v) {}
}

想要點擊不同的item時做一些不同的事,就又又又要修改onBindViewHolder
給itemView設定點擊事件

@Override
    public void onBindViewHolder(@NonNull ButViewHolder holder, int position) {
        //將資料和控制元件系結
        holder.name.setText(nameList.get(position));
        holder.news.setText(newsList.get(position));
        holder.time.setText(timeList.get(position));
        
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {}
        });
    }

就這樣???
如果我想在Activity中設定點擊事件呢,比如跳轉頁面這種情況
添加點擊事件介面,傳值嘛
你想要什么就傳什么,比如我想要點擊的item的name,就傳個name

 public interface OnItemClickListener {
        void onItemClick(String name);
    }

有介面,就要Activity那邊實作,所以Adapter里新增一個方法
同時,介面里的方法需要傳給成員變數

private OnItemClickListener mListener;

public void setOnItemClickListener(OnItemClickListener li) {
        mListener = li;
    }

最后在系結中的點擊事件中添加

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            	mListener.onItemClick(nameList.get(position));
            }
        });

這么說好像有些別扭
總結就是

  1. Adapter創建點擊事件介面
  2. Activity實作介面
  3. 實作后的介面存入Adapter的成員變數
  4. 當點擊item時,觸發onBindViewHolder中設定的系結事件
  5. 系結事件執行的是 Activity中傳給成員變數的方法

這時,點擊事件已經完成,就這樣吧,回家咯!
下次有時間寫個加頭或尾的文章類似于B站的獨占一行方法

在這里插入圖片描述不要在意內容!!!

對本文有任何意見或疑問,或者認為其中說法有誤,歡迎在評論區留言!!!
最后,轉載請注明出處!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/280223.html

標籤:其他

上一篇:自定義控制元件-時間軸

下一篇:Android——新大陸云平臺篇

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more