import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.appcompat.app.AppCompatActivity
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.LinearLayoutManager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
class PullToRefreshScreen : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener {
private lateinit var swipeRefreshLayout: SwipeRefreshLayout
private lateinit var recyclerView: RecyclerView
private val items = mutableListOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")
private lateinit var adapter: ItemAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_pull_to_refresh)
swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
adapter = ItemAdapter(items)
recyclerView.adapter = adapter
swipeRefreshLayout.setOnRefreshListener(this)
}
override fun onRefresh() {
// Show loading spinner for 2 seconds
Handler(Looper.getMainLooper()).postDelayed({
for (i in items.indices) {
items[i] = items[i].removeSuffix(" - refreshed") + " - refreshed"
}
adapter.notifyDataSetChanged()
swipeRefreshLayout.isRefreshing = false
}, 2000)
}
}
class ItemAdapter(private val items: List<String>) : RecyclerView.Adapter<ItemAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(android.R.id.text1)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.text = items[position]
}
override fun getItemCount(): Int = items.size
}This solution uses SwipeRefreshLayout to enable the pull-to-refresh gesture. The activity implements SwipeRefreshLayout.OnRefreshListener to listen for the pull gesture.
When the user pulls down, onRefresh() is called. We simulate a 2-second loading delay using a Handler and postDelayed. After the delay, we update each item by appending " - refreshed" (removing duplicates if any), then notify the adapter to refresh the list UI.
The refreshing spinner is stopped by setting isRefreshing = false. The ItemAdapter is a simple RecyclerView adapter that shows each item in a text view.
This approach keeps the UI responsive and provides a familiar pull-to-refresh experience.