RecyclerView has following components
LayoutManager :
The RecyclerView fills itself with views provided by a layout manager that you provide.
You can use one of our standard layout managers (such as LinearLayoutManager or GridLayoutManager) or implement your own .
ViewHolder :
Each Row in the list represent ViewHolder Object ,Each view holder is in charge of displaying a single item with a view. You must define a viewholder class which mush extend RecyclerView.ViewHolder .
Adapter :
Adapter is responsible for creating and inflating layout for each row (row represents viewholder) and binding data to it .
Add RecyclerView to your layout
Create XML Layout activity_main.xml , this will be set as content view for launcher Activity (MainActivity.kt) . Add RecyclerView to your layout file .
file : activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:layout_marginStart="10dp" android:orientation="vertical"> <androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:id="@+id/rcv"/> </LinearLayout>
Data Class
To Load Data Into RecyclerView , We will Read JSON File Kept Inside Asset folder and map it to below defined data class.
file : main\assets\android_version.json
[ { "name": "Cupcake", "version": "Android 1.5" }, { "name": "Donut", "version": "Android 1.6" }, { "name": "Eclairs", "version": "Android 2.0-2.1" }, { "name": "Froyo", "version": "Android 2.2-2.3" }, { "name": "Gingerbread", "version": "Android 2.3-2.3.7" }, { "name": "Honeycomb", "version": "Android 3.0-3.2.6" }, { "name": "Icecream", "version": "Android 4.0-4.0.4" }, { "name": "Jellybean", "version": "Android 4.1-4.3.1" }, { "name": "Kitkat", "version": "Android 4.4-4.4.4" }, { "name": "Lolipop", "version": "Android 5.0-5.1.1" }, { "name": "Marshmallow", "version": "Android 6.0-6.0.1" }, { "name": "Nougat", "version": "Android 7.0-7.1.2" }, { "name": "Oreo", "version": "Android 8.0-8.1" }, { "name": "Pie", "version": "Android 9.0" } ]
file : model.kt
package com.tutorialsbuzz.recyclerview data class Model(val name: String, val version: String) {}
Adapter and ViewHolder For RecyclerView .
1. XML Layout for recyclerView item
Create XML Layout file in res/layout and name it row_item.xml ,This Layout defines the layout for Items of RecyclerView . Here In this example we have two TextView inside LinearLayout .
file : row_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:padding="20dp" android:layout_height="wrap_content"> <TextView android:id="@+id/txt" android:textSize="22sp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textStyle="bold"/> <TextView android:id="@+id/sub_txt" android:textSize="18sp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textStyle="italic"/> </LinearLayout>
2. Adapter class
Create a Adapter That RecyclerView Can Use ,Create a class CustomAdapter extend it to RecyclerView.Adapter . RecyclerView.Adapter has three abstract methods that we must override .
- onCreateViewHolder() :Inside this method we specify the layout that each item of the RecyclerView should use .onCreateViewHolder has return type of RecyclerView.ViewHolder which represent each row of recyclerView. Using Inflator get the view of above defined row_item and pass it to viewholder constructor and then return.
- onBindViewHolder() : Inside this method data will be displayed at the specified position .
- getItemCount() : Returns the total number of items in the data set held by the adapter.
3. ViewHolder
Create Inner class ViewHolder inside CustomAdapter class extend it to RecyclerView.ViewHolder , add bind function which takes above defined model data class object .
file : CustomAdapter.kt
package com.tutorialsbuzz.recyclerview import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.row_item.view.* class CustomAdapter(val modelList: List<Model>, val context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { (holder as ViewHolder).bind(modelList.get(position)); } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val layoutInflater = LayoutInflater.from(parent.context) return ViewHolder(layoutInflater.inflate(R.layout.row_item, parent, false)) } override fun getItemCount(): Int { return modelList.size; } inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(model: Model): Unit { itemView.txt.text = model.name itemView.sub_txt.text = model.version } } }
3. Activity
- Create a koltin class MainActivity.kt and extend it to AppCompatActivity class .
- Override onCreate function and set the content of this MainActivity with above defined xml layout (activity_main.xml).
- Read JSON Data From Asset Folder , this will be used for binding data into RecyclerView .
- Set Vertical Linear LayoutManager to RecyclerView.
- Create Instance of Adapter and set to RecyclerView .
package com.tutorialsbuzz.recyclerview import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.activity_main.* import org.json.JSONArray import org.json.JSONObject class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val model = readFromAsset(); val adapter = CustomAdapter(model, this) rcv.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) rcv.adapter = adapter; } private fun readFromAsset(): List<Model> { val modeList = mutableListOf<Model>() val bufferReader = application.assets.open("android_version.json").bufferedReader() val json_string = bufferReader.use { it.readText() } val jsonArray = JSONArray(json_string); for (i in 0..jsonArray.length() - 1) { val jsonObject: JSONObject = jsonArray.getJSONObject(i) val model = Model(jsonObject.getString("name"), jsonObject.getString("version")) modeList.add(model) } return modeList } }
No comments:
Post a Comment