I am developing an app which contain two nested (task_rv contains in taskDate_rv) recycle view. I am interested in swipe to delete of items in inner recycle view i.e. task_rv. I am not getting right item in log which I swipe in task_rv and getting wrong item in log.
code of SwipeViewHelper.kt class is
package com.example.todoapp.Helper
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
abstract class SwipeViewHelper: ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
}
}
code of TaskDateAdapter.kt is
package com.example.todoapp.Adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.todoapp.Helper.SwipeViewHelper
import com.example.todoapp.MainActivity
import com.example.todoapp.data.TaskDate
import com.example.todoapp.database.TaskEntity
import com.example.todoapp.database.TaskViewModel
import com.example.todoapp.databinding.TaskDateModelBinding
class TaskDateAdapter(val viewModel: TaskViewModel):RecyclerView.Adapter<TaskDateAdapter.ViewHolder>() {
class ViewHolder(var taskDateModelBinding: TaskDateModelBinding):RecyclerView.ViewHolder(taskDateModelBinding.root)
private lateinit var taskAdapter: TaskAdapter
// creating diff
private val differCallBack= object :DiffUtil.ItemCallback<TaskDate>(){
override fun areItemsTheSame(oldItem: TaskDate, newItem: TaskDate): Boolean {
return oldItem.date==newItem.date &&
oldItem.taskDateList==newItem.taskDateList
}
override fun areContentsTheSame(oldItem: TaskDate, newItem: TaskDate): Boolean {
return oldItem==newItem
}
}
val differDate=AsyncListDiffer(this,differCallBack)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(TaskDateModelBinding.inflate(LayoutInflater.from(parent.context),parent,false))
}
override fun getItemCount(): Int {
return differDate.currentList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
taskAdapter= TaskAdapter(viewModel)
val curr= differDate.currentList[position]
holder.taskDateModelBinding.taskDateTdm.text=curr.date
holder.taskDateModelBinding.taskRv.adapter=taskAdapter
taskAdapter.differ.submitList(curr.taskDateList)
//val swipe
setUpSwipe(holder.taskDateModelBinding.taskRv)
}
private fun setUpSwipe(recyclerView: RecyclerView){
var swipeHelper=object: SwipeViewHelper(){
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
when(direction){
ItemTouchHelper.LEFT ->{
taskAdapter.deleteTask(viewHolder.adapterPosition)
}
}
super.onSwiped(viewHolder, direction)
}
}
val touchHelper=ItemTouchHelper(swipeHelper)
touchHelper.attachToRecyclerView(recyclerView)
}
}
code of TaskAdapter.kt is
package com.example.todoapp.Adapter
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import com.example.todoapp.Helper.SwipeViewHelper
import com.example.todoapp.MainActivity
import com.example.todoapp.data.TaskDate
import com.example.todoapp.database.TaskEntity
import com.example.todoapp.database.TaskViewModel
import com.example.todoapp.databinding.TaskModelBinding
import java.util.Objects
class TaskAdapter(val viewModel: TaskViewModel):RecyclerView.Adapter<TaskAdapter.ViewHolder>() {
class ViewHolder(var binding: TaskModelBinding) :RecyclerView.ViewHolder(binding.root)
// creating diff
private val differCallBack= object :DiffUtil.ItemCallback<TaskEntity>(){
override fun areItemsTheSame(oldItem: TaskEntity, newItem: TaskEntity): Boolean {
return oldItem.taskName==newItem.taskName &&
oldItem.id==newItem.id &&
oldItem.taskDate==newItem.taskDate &&
oldItem.taskTime ==newItem.taskTime &&
oldItem.taskNotificationStatus ==newItem.taskNotificationStatus &&
oldItem.taskdescription==newItem.taskdescription
}
override fun areContentsTheSame(oldItem: TaskEntity, newItem: TaskEntity): Boolean {
return oldItem==newItem
}
}
val differ=AsyncListDiffer(this,differCallBack)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var binding=TaskModelBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return ViewHolder(binding)
}
override fun getItemCount(): Int {
return differ.currentList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val curr=differ.currentList[position]
holder.binding.taskName.text=curr.taskName
}
fun deleteTask(swipePosition:Int){
try {
Log.d("_DeletedTask_",differ.currentList[swipePosition].toString())
// viewModel.deleteTask(differ.currentList[swipePosition])
}catch (exception:Exception){
Log.e("_DeletedTaskException_",exception.message.toString())
}
}
}