2023年10月31日 星期二

【Android Studio】RecyclerView




使用 RecyclerView 顯示可捲動的清單 (android.com)


Layout Manager

  • linear
  • grid
    • 垂直
    • 水平
  • staggered grid : 不求垂直的 grid 高度或水平的 grid 寬度一致

實作 Adapter 、ViewHolder

以下為範例,傳入 adapter 的參數與 adapter 、 view holder 的命名都並非固定
class CustomAdapter(private val dataSet: Array<String>) :
        RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder).
     */
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView

        init {
            // Define click listener for the ViewHolder's View.
            textView = view.findViewById(R.id.textView)
        }
    }

    // Create new views (invoked by the layout manager)
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        // Create a new view, which defines the UI of the list item
        val view = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.text_row_item, viewGroup, false)

        return ViewHolder(view)
    }

    // Replace the contents of a view (invoked by the layout manager)
    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.textView.text = dataSet[position]
    }

    // Return the size of your dataset (invoked by the layout manager)
    override fun getItemCount() = dataSet.size

}

  • class CustomAdapter : 傳入 dataset
    • class ViewHolder
      設置會用到的 view與其 id (不管來源檔案,只管 id)
    • onCreateViewHolder()
      設 item 的 xml
    • onBindViewHolder
      依據 position 設置 view 要顯示的內容與 onClickListener 等
    • getItemCount()
      回傳 dataset.size

在 Fragment 中設定 RecyclerView

例子 :
val recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view)
recyclerView.adapter = ArticlesAdapter(articlesIDAndTitle)
recyclerView.setHasFixedSize(true)

layout XML中的設定 (實例)

在 Fragment 的 layout 中插入 RecyclerView :

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_margin="16dp"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager">
顯示範例圖片:
tools:itemCount="16"
tools:listitem="@layout/grid_view_item"



在 Adapter 中會使用到的 item layout :

就是普通的 layout ,請自由設定。


ListAdapter 

ListAdapter 是 RecyclerView.Adapter 類別的子類別,用來在 RecyclerView 中顯示清單資料,包括在背景執行緒上計算清單之間的差異。
在此應用程式中,您將在 ListAdapter. 中使用 DiffUtil 實作。使用 DiffUtil 的優勢在於,每當新增、移除或變更 RecyclerView 中的某些項目時,系統不會重新整理整個清單。系統只會重新整理已變更的項目。

資料來源

0 comments:

張貼留言