iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0

在第八天,你已經在 App 裡準備好了一個「空的書架」(RecyclerView),也為「書本封面」(list_item.xml)設計好了樣式。

但目前為止,App 還是無法將你的資料清單 (dataList) 顯示出來。這是因為我們還缺少一個最重要的角色:「電影院經理」—— Adapter

今天,我們要完成 AdapterViewHolder 這兩個核心角色。

AdapterViewHolder 複習

  • Adapter:就像「電影院經理」,它負責管理資料 (dataList),並將資料一個個放入「電影海報」(list_item.xml)裡。
  • ViewHolder:就是我們的「電影海報」,它是一個容器,裡面放著 list_item.xml 裡的元件(例如 TextView)。

實作時間:撰寫你的 Adapter

我們來完成 MyAdapter.java 的程式碼。

  1. 開啟 MyAdapter.java 檔案
    打開你在第八天建立的 MyAdapter.java 檔案。
  2. 撰寫 Adapter 的程式碼
    這段程式碼會比較長,我 會在註解中詳細解釋每個部分。

`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 final List<String> dataList;

// 建構子,用來接收資料清單
public MyAdapter(List<String> dataList) {
    this.dataList = dataList;
}

// 這個方法負責「製作電影海報」
// 當 RecyclerView 需要一個新的 View 時,會呼叫這個方法
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // 1. 取得 list_item.xml 這個設計圖
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    // 2. 用這個設計圖來建立一個 MyViewHolder 實例
    return new MyViewHolder(view);
}

// 這個方法負責「填入電影海報的內容」
// 當 RecyclerView 準備好一個 View 時,會呼叫這個方法
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    // 1. 根據 position (位置),從資料清單中取得對應的資料
    String text = dataList.get(position);
    // 2. 把資料設定到海報上的 TextView
    holder.itemTextView.setText(text);
}

// 這個方法負責「清點書本總數」
// 它會告訴 RecyclerView,總共有多少個列表項目
@Override
public int getItemCount() {
    return dataList.size();
}

// 這個靜態內部類別,代表了「電影海報」
// 它會持有 list_item.xml 中所有的元件
static class MyViewHolder extends RecyclerView.ViewHolder {
    TextView itemTextView;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        // 找到 list_item.xml 中 id 為 itemTextView 的元件
        itemTextView = itemView.findViewById(R.id.itemTextView);
    }
}

}`

  1. 修改 MainActivity.java 檔案
    • 我們需要告訴 MainActivity,請把資料清單交給 Adapter,再把 Adapter 交給 RecyclerView

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

public class MainActivity extends AppCompatActivity {

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

    // 1. 找到 RecyclerView 元件
    RecyclerView myRecyclerView = findViewById(R.id.myRecyclerView);

    // 2. 準備要顯示的資料清單
    List<String> myData = new ArrayList<>();
    myData.add("小明");
    myData.add("小華");
    myData.add("小李");
    myData.add("小王");
    myData.add("小陳");
    myData.add("小美");
    myData.add("小琪");

    // 3. 建立 Adapter 實例,並把資料清單傳給它
    MyAdapter myAdapter = new MyAdapter(myData);

    // 4. 設定 RecyclerView 的「排隊規則」(垂直排成一列)
    myRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    // 5. 將 Adapter 設定給 RecyclerView
    myRecyclerView.setAdapter(myAdapter);
}

}`

執行你的 App!

點擊綠色的「」按鈕,執行你的 App。就會看到畫面上出現一個可以上下滾動的列表,裡面顯示著「小明」、「小華」、「小李」等名字!
day9

現在已經成功讓 RecyclerView 運作起來,並且能夠顯示動態的資料清單了!


今日總結

今天我們學會了:

  • AdapterViewHolder 的具體職責和運作方式。
  • onCreateViewHolderonBindViewHoldergetItemCount 這三個核心方法的用途。
  • 如何將 LayoutManagerAdapter 和資料清單連結起來,讓 RecyclerView 能夠正常運作。

明天,我們會學習如何在列表項目上加入點擊事件,讓你的 App 可以對點擊做出回應!

明天見!


上一篇
Day8- 認識 RecyclerView
系列文
Android 開發者養成計畫:從程式邏輯到作品集實戰9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言