Android Tutorial

Software Setup and Configuration

Android Studio

File Structure

Components

Core Topics

Layout

View

Button

Intent and Intent Filters

Toast

RecyclerView

Fragments

Adapters

Other UI Component

Image Loading Libraries

Date and Time

Material Design

Bars

Working with Google Maps

Chart

Animation

Database

Advance Android

Jetpack

Architecture

App Publish

App Monetization

RecyclerView in Android with Example

RecyclerView is a powerful UI component that lets you display a scrollable list of items, which can be in a grid, linear list, or other layouts. Here's a basic example of how to implement a RecyclerView to display a list of strings:

1. Add the necessary dependencies:

In your app module's build.gradle file, add the following:

implementation 'androidx.recyclerview:recyclerview:1.x.x' // replace x.x with the latest version

2. XML layout:

In your activity or fragment layout (activity_main.xml):

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

3. Create a layout for the individual list items (list_item.xml):

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:textSize="18sp" />

4. Create an Adapter for RecyclerView:

Create a Kotlin file named MyAdapter.kt:

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class MyAdapter(private val myList: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textView: TextView = itemView.findViewById(R.id.textView)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
        return MyViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = myList[position]
        holder.textView.text = currentItem
    }

    override fun getItemCount() = myList.size
}

5. Setup RecyclerView in your activity:

In MainActivity.kt:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class MainActivity : AppCompatActivity() {

    private lateinit var recyclerView: RecyclerView
    private lateinit var myAdapter: MyAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myList = listOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")

        recyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        myAdapter = MyAdapter(myList)
        recyclerView.adapter = myAdapter
    }
}

This sets up a basic RecyclerView to display a list of strings. There are more features and functionalities you can add, such as ViewHolder click listeners, different layouts, animations, etc.

  1. RecyclerView in Android Kotlin example:

    Include the RecyclerView in your XML layout:

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    In your Kotlin code, set up the RecyclerView with a layout manager and adapter:

    val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = MyAdapter(dataList)
    
  2. Creating a simple RecyclerView in Android:

    Create a layout for each item (e.g., item_layout.xml). Create an adapter that inflates this layout:

    class MyAdapter(private val dataList: List<String>) :
        RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    
        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_layout, parent, false)
            return ViewHolder(view)
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            // Bind data to views
            holder.itemView.findViewById<TextView>(R.id.textView).text = dataList[position]
        }
    
        override fun getItemCount(): Int {
            return dataList.size
        }
    }
    
  3. Android RecyclerView adapter and ViewHolder example:

    The adapter binds data to the views and the ViewHolder holds references to the views:

    class MyAdapter(private val dataList: List<String>) :
        RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    
        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            // Inflate item layout and return ViewHolder
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            // Bind data to views
        }
    
        override fun getItemCount(): Int {
            return dataList.size
        }
    }
    
  4. Adding click events to RecyclerView items in Android:

    Implement click events in the onBindViewHolder method:

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = dataList[position]
    
        holder.itemView.setOnClickListener {
            // Handle item click
            Toast.makeText(holder.itemView.context, "Clicked: $item", Toast.LENGTH_SHORT).show()
        }
    }
    
  5. Customizing RecyclerView layout in Android:

    Customize the layout manager for different arrangements:

    recyclerView.layoutManager = GridLayoutManager(this, 2)
    // or
    recyclerView.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
    
  6. Swipe to delete in RecyclerView Android example:

    Implement swipe-to-delete using an ItemTouchHelper:

    val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
        0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
    ) {
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            return false
        }
    
        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            // Handle swipe (e.g., remove item from the list)
        }
    })
    
    itemTouchHelper.attachToRecyclerView(recyclerView)
    
  7. CardView with RecyclerView in Android Kotlin:

    Include the CardView dependency and use it in the item layout:

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="8dp"
        app:cardElevation="4dp">
    
        <!-- Your item layout goes here -->
    
    </androidx.cardview.widget.CardView>
    
  8. Filtering data in RecyclerView Android example:

    Implement filtering in your adapter:

    class MyAdapter(private val originalData: List<String>) :
        RecyclerView.Adapter<MyAdapter.ViewHolder>(), Filterable {
    
        private var filteredData: List<String> = originalData
    
        override fun getFilter(): Filter {
            return object : Filter() {
                override fun performFiltering(constraint: CharSequence?): FilterResults {
                    val filterResults = FilterResults()
                    val query = constraint.toString().toLowerCase(Locale.getDefault())
    
                    filteredData = if (query.isEmpty()) {
                        originalData
                    } else {
                        originalData.filter { it.toLowerCase(Locale.getDefault()).contains(query) }
                    }
    
                    filterResults.values = filteredData
                    return filterResults
                }
    
                override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                    filteredData = results?.values as List<String>
                    notifyDataSetChanged()
                }
            }
        }
    
        // Rest of the adapter implementation remains the same
    }