在第八天,你已經在 App 裡準備好了一個「空的書架」(RecyclerView
),也為「書本封面」(list_item.xml
)設計好了樣式。
但目前為止,App 還是無法將你的資料清單 (dataList
) 顯示出來。這是因為我們還缺少一個最重要的角色:「電影院經理」—— Adapter
。
今天,我們要完成 Adapter
和 ViewHolder
這兩個核心角色。
Adapter
與 ViewHolder
複習Adapter
:就像「電影院經理」,它負責管理資料 (dataList
),並將資料一個個放入「電影海報」(list_item.xml
)裡。ViewHolder
:就是我們的「電影海報」,它是一個容器,裡面放著 list_item.xml
裡的元件(例如 TextView
)。Adapter
我們來完成 MyAdapter.java
的程式碼。
MyAdapter.java
檔案MyAdapter.java
檔案。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);
}
}
}`
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。就會看到畫面上出現一個可以上下滾動的列表,裡面顯示著「小明」、「小華」、「小李」等名字!
現在已經成功讓 RecyclerView
運作起來,並且能夠顯示動態的資料清單了!
今天我們學會了:
Adapter
和 ViewHolder
的具體職責和運作方式。onCreateViewHolder
、onBindViewHolder
、getItemCount
這三個核心方法的用途。LayoutManager
、Adapter
和資料清單連結起來,讓 RecyclerView
能夠正常運作。明天,我們會學習如何在列表項目上加入點擊事件,讓你的 App 可以對點擊做出回應!
明天見!