Android教程2020 - RecyclerView使用入門


本文鏈接
本文介紹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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM