Unable to use swipe to delete in nested recycleView

28 Views Asked by At

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())
         }



    }


}
0

There are 0 best solutions below