iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0

今天來介紹第二部分,基本上就是教你如何實作,那就開始吧٩( 'ω' )و

實作步驟與範例程式碼

加入RecyclerView的依賴

確保你的 build.gradle(Module: app) 檔案中有RecyclerView的依賴,在新版的 Android Studio 專案中,通常已經包含在material依賴裡面了:))

dependencies {
implementation 'androidx.recyclerview:recyclerview:1.3.2'
// 或者看到有使用 Material Components的話應該也可以,它裡面有包含了RecyclerView
// implementation 'com.google.android.material:material:1.12.0'
}

建立數據模型 (Data Model)

這個範例中我們只顯示字串,所以可以省略這一步。但如果你的項目是複雜的物件(例如聯絡人),你會建立一個像這樣的類別:

public class Contact {
    private String name;
    private String phoneNumber;

    // Constructor, getters, and setters...
}

設計單一項目的佈局 (Item Layout)

在 res/layout 資料夾下,建立一個新的 XML 檔案,這邊以list_item.xml 作範例

list_item.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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

建立 Adapter 和 ViewHolder

建立一個新的 Java 類別,這邊以MyAdapter.java 為範例

MyAdapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private Context context;
    private List<String> dataList;

    //Adapter的建構子,傳入context和資料來源
    public MyAdapter(Context context, List<String> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    //建立ViewHolder的實例
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //載入list_item.xml
        View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
        return new MyViewHolder(view);
    }

    //負責將資料綁定到ViewHolder上
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        // 取得特定位置的資料
        String data = dataList.get(position);
        // 將資料設定到 ViewHolder 的 TextView 中
        holder.textView.setText(data);
    }

    //回傳資料的總數
    @Override
    public int getItemCount() {
        return dataList.size();
    }

    //ViewHolder類別,持有每個項目的View
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            // 透過 itemView.findViewById 找到項目佈局中的 UI 元件
            textView = itemView.findViewById(R.id.item_textview);
        }
    }
}

在 Activity 中設定 RecyclerView

在你activity_main.xml中加入 RecyclerView,並在 MainActivity.java 中進行設定

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private MyAdapter myAdapter;
    private List<String> sampleData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //找到RecyclerView
        recyclerView = findViewById(R.id.recycler_view);

        //準備資料
        sampleData = new ArrayList<>();
        for (int i = 1; i <= 30; i++) {
            sampleData.add("項目 " + i);
        }

        //建立Adapter實例
        myAdapter = new MyAdapter(this, sampleData);

        //建立LayoutManager
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL); // 設定為垂直滾動

        //為RecyclerView設定LayoutManager和Adapter
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(myAdapter);
    }
}

處理點擊

處理 RecyclerView 的點擊事件,可以在Adapter中定義一個 Interface

  1. Adapter 中定義Interface

    //在MyAdapter 類別中新增
    public interface OnItemClickListener {
        void onItemClick(int position);
    }
    
    private OnItemClickListener listener;
    
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
    
  2. onBindViewHolder 中設定點擊監聽

    //在onBindViewHolder 方法中新增
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listener != null) {
                //使用getAdapterPosition() 獲取準確的位置
                int position = holder.getAdapterPosition();
    
    		        //確保位置有效
                if (position != RecyclerView.NO_POSITION) { 
                    listener.onItemClick(position);
                }
            }
        }
    });
    
  3. 在 Activity 中實作Interface

    //在MainActivity.java的onCreate中
    myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            String clickedItem = sampleData.get(position);
            Toast.makeText(MainActivity.this, "你點擊了: " + clickedItem, Toast.LENGTH_SHORT).show();
        }
    });
    

RecyclerView就先介紹到這裡了,明天會來介紹別的,明天見Φ౪Φ

https://ithelp.ithome.com.tw/upload/images/20251003/20176154EakqWETMlU.png


上一篇
Day18 RecyclerView介紹1
系列文
Android 菜鳥30天從0到1的學習紀錄19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言