はじめに
こんにちは。miyagawaです。
RecyclerViewを使ってリスト表示をしているのですが、いくつか詰まった点があったので備忘録としてまとめたいと思います。
かなり基礎的なものですが、なんどもつまづいてしまうと時間のロスだな、と感じています。
今回もKotlinで書いていきます。
GradleファイルにRecyclerViewの設定を追加する
gradle(app)ファイルにRecyclerViewの設定を追記します。
dependencesの中に追記してください。
1 2 3 4 5 | dependencies { ... implementation 'androidx.recyclerview:recyclerview:1.0.0' // 追記 ... } |
レイアウトファイルの作成
まずは
MainActivity
のレイアウトに
RecyclerView
を追加します。
先ほどのgradleファイルに設定を追加していないとエラーが出るのでご注意ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <RelativeLayout android:id="@+id/mainActivityRoot" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"> </androidx.recyclerview.widget.RecyclerView> </RelativeLayout> </layout> |
次に、
RecyclerView
の中身(1行分)のレイアウトファイルを作成します。
ここで注意するべき点は、LinearLayoutを必ずルートのレイアウトとして使用することです。
後ほど設定する
LinearLayoutManager
というRecyclerViewに設定するものがあるのですが、これがないと正常に動作しません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textViewSample" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:text="sample" android:textColor="#000000" android:layout_margin="8dp"/> <!-- iOSのように1行1行の間に線を入れる場合は下記の設定を入れる --> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_alignParentBottom="true" android:background="#e6e6e6" /> </LinearLayout> |
Adapterクラスの追加
レイアウトファイルの設定が完了したところで、次は
SampleListItemAdapter
のktファイルに追記していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | internal class SampleListItemAdapter(private var context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { private var mSampleItems: List<String> = listOf() fun setSampleList(sampleItems: List<String>) { mSampleItems = sampleItems notifyDataSetChanged() } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val sampleView = LayoutInflater.from(parent.context) .inflate(R.layout.list_item_sample, parent, false) return SampleListHolder(sampleView) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { (holder as SampleListHolder).bind( context, mSampleItems.get(position) ) } override fun getItemCount(): Int { return mSampleItems.size } private inner class SampleListHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val sampleTextView: TextView init { sampleTextView = itemView.findViewById(R.id.textViewSample) } internal fun bind(context: Context, sampleText: String) { sampleTextView.text = sampleText } } } |
Activityファイルへの追加
最後に
MainActivity
にAdapterの設定を行います。
LinearLayoutManagerの設定忘れにご注意ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class MainActivity : AppCompatActivity() { private lateinit var sampleListAdapter: SampleListItemAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) sampleListAdapter = SampleListItemAdapter(this) var list = listOf("おはようございます", "こんにちは", "こんばんは") sampleListAdapter.setSampleList(list) // 注意:このLinearLayoutManagerがないと正常に動作しません。 val linearLayoutManager = LinearLayoutManager(this) linearLayoutManager.orientation = LinearLayoutManager.VERTICAL recyclerView.layoutManager = linearLayoutManager recyclerView.adapter = sampleListAdapter } } |
さいごに
今回はRecyclerViewの備忘録を書きました。
毎回LinearLayoutManagerの設定を忘れてしまうので、しっかり覚えておきたいと思います。