AndroidのRecyclerViewについて(最初の最初)
RecyclerViewの使い方をまとめます。 公式ドキュメント
RecyclerView | Android Developers
Create a List with RecyclerView | Android Developers
ですが、英語なので日本語のもので下記を参考にしました。
【kotlin】RecyclerViewの簡単な使い方【初心者向け】
必要な部品
RecyclerViewを実装するのに必要な部品は
それぞれの役割と例
xml(RecyclerView)
そのまま、実際RecyclerViewを表示するxml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
xml(itemView)
RecyclerViewで表示する1つづつのアイテムのレイアウトのxml
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/row_title"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="0.3"
tools:text="titleです" />
<TextView
android:id="@+id/row_detail"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="0.7"
tools:text="詳細ですよ詳細ですよ詳細ですよ詳細ですよ詳細ですよ" />
</LinearLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
Activity or Fragment
RecyclerViewを表示するxmlに紐づく処理
MainActivity
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.util.Log
import android.view.View
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Log.d("Life Cycle","onCreate")
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = recycler_list
val adapter = ViewAdapter(createDataList(), object : ViewAdapter.ListListener {
override fun onClickRow(tappedView: View, rowModel: RowModel) {
Toast.makeText(applicationContext, rowModel.title,Toast.LENGTH_LONG).show()
}
})
recyclerView.setHasFixedSize(true)
recyclerView.layoutManager = LinearLayoutManager(applicationContext)
recyclerView.adapter = adapter
}
private fun createDataList(): List<RowModel> {
Log.d("Life Cycle","createDataList")
val dataList = mutableListOf<RowModel>()
for (i in 0..49) {
val data: RowModel = RowModel().also {
it.title = "タイトル" + i + "だよ"
it.detail = "詳細" + i + "個目だよ"
}
dataList.add(data)
}
return dataList
}
}
Adapter
ViewAdapter
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class ViewAdapter(private val list: List<RowModel>, private val listener: ListListener) : RecyclerView.Adapter<HomeViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeViewHolder {
Log.d("Life Cycle", "onCreateViewHolder")
val rowView: View = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
return HomeViewHolder(rowView)
}
override fun onBindViewHolder(holder: HomeViewHolder, position: Int) {
Log.d("Life Cycle", "onBindViewHolder")
holder.titleView.text = list[position].title
holder.detailView.text = list[position].detail
holder.itemView.setOnClickListener {
listener.onClickRow(it, list[position])
}
}
override fun getItemCount(): Int {
Log.d("Life Cycle", "getItemCount")
return list.size
}
interface ListListener {
fun onClickRow(tappedView: View, rowModel: RowModel)
}
}
dataModel
itemに入れるデータ
RawModel.kt
class RowModel {
var title: String = ""
var detail: String = ""
}
viewHolder
itemViewのそれぞれのViewのホルダー
ViewHolder.kt
import android.support.v7.widget.RecyclerView
import android.view.View
import android.widget.TextView
class HomeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
val titleView: TextView = itemView.findViewById(R.id.row_title)
val detailView: TextView = itemView.findViewById(R.id.row_detail)
}
ついでに
リストを2列にしたい場合は、
recyclerView.layoutManager = LinearLayoutManager(applicationContext)
を
recyclerView.layoutManager = GridLayoutManager(applicationContext, 2)
にすればOK
おわりに
これで、ひとまずRecyclerViewは使える。 応用やもっと深いことなどを学習したら、またまとめる。