空列表不包含Item Touch Helper的索引0处的元素

问题描述

我在itemtouchhelper和recyclerview中遇到两个问题。我的主要活动中有两个单独的片段中的回收者视图。

  1. 我的第一个问题是,即使物品触摸助手非常相同,它也不会滑动或无法用于我的第二个回收器视图。

  2. 每当我进行滑动删除操作时,都会得到空列表不包含索引0处的元素。我有点理解为什么,但是我看到其他人使用相同的方法,所以我不知道如何解决

片段1(可以滑动):

    package com.example.bubblereminder

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.lifecycle.viewmodelProvider
import androidx.recyclerview.widget.itemtouchhelper
import androidx.recyclerview.widget.linearlayoutmanager
import androidx.recyclerview.widget.RecyclerView
import com.example.bubblereminder.room.Reminderslistadapter
import com.example.bubblereminder.room.Remindersviewmodel
import kotlinx.android.synthetic.main.fragment_scheduled.*

class ScheduledFragment : Fragment() {
    private lateinit var reminderviewmodel: Remindersviewmodel

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {

        val v = inflater.inflate(R.layout.fragment_scheduled,container,false)

        return v
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val recyclerView = view?.findViewById<RecyclerView>(R.id.recycler_scheduled)
        val adapter = context?.let { Reminderslistadapter(it) }
        if (recyclerView != null) {
            recyclerView.adapter = adapter
        }
        if (recyclerView != null) {
            recyclerView.layoutManager = linearlayoutmanager(context)
        }

        this.reminderviewmodel = viewmodelProvider(this).get(Remindersviewmodel::class.java)
        reminderviewmodel.allRemindersDue.observe(viewLifecycleOwner,Observer { reminders ->
            // Update the cached copy of the words in the adapter.
            reminders?.let {
                if (adapter != null) {
                    adapter.setReminders(it)
                }
            }
        })

        itemtouchhelper(itemtouchhelperCallback).attachToRecyclerView(recycler_scheduled)
    }

    private val itemtouchhelperCallback = object : itemtouchhelper.SimpleCallback(0,itemtouchhelper.LEFT)
    {
        override fun onMove(
            recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder
        ): Boolean {
            Todo("Not yet implemented")
        }

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder,position: Int) {
            reminderviewmodel.delete(Reminderslistadapter(activity as MainActivity).getReminderAt(viewHolder.adapterPosition))
        }

    }
}

片段2(无法滑动):

    package com.example.bubblereminder

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.lifecycle.viewmodelProvider
import androidx.recyclerview.widget.itemtouchhelper
import androidx.recyclerview.widget.linearlayoutmanager
import androidx.recyclerview.widget.RecyclerView
import com.example.bubblereminder.room.Reminderslistadapter
import com.example.bubblereminder.room.Remindersviewmodel
import kotlinx.android.synthetic.main.fragment_done.*

class DoneFragment : Fragment() {
    private lateinit var reminderviewmodel: Remindersviewmodel

    override fun onCreateView(
        inflater: LayoutInflater,false)

        return v
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val recyclerView = view?.findViewById<RecyclerView>(R.id.recycler_scheduled)
        val adapter = context?.let { Reminderslistadapter(it) }
        if (recyclerView != null) {
            recyclerView.adapter = adapter
        }
        if (recyclerView != null) {
            recyclerView.layoutManager = linearlayoutmanager(context)
        }

        this.reminderviewmodel = viewmodelProvider(this).get(Remindersviewmodel::class.java)
        reminderviewmodel.allRemindersDone.observe(viewLifecycleOwner,Observer { reminders ->
            // Update the cached copy of the words in the adapter.
            reminders?.let {
                if (adapter != null) {
                    adapter.setReminders(it)
                }
            }
        })

        itemtouchhelper(itemtouchhelperCallback).attachToRecyclerView(recycler_done)
    }

    private val itemtouchhelperCallback = object : itemtouchhelper.SimpleCallback(0,position: Int) {
            reminderviewmodel.delete(Reminderslistadapter(activity as MainActivity).getReminderAt(viewHolder.adapterPosition))
        }

    }
}

我的适配器:

    package com.example.bubblereminder.room

import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.lifecycle.LiveData
import androidx.recyclerview.widget.RecyclerView
import com.example.bubblereminder.R
import java.util.*

class Reminderslistadapter internal constructor(
    context: Context
) : RecyclerView.Adapter<Reminderslistadapter.RemindersViewHolder>() {

    private val inflater: LayoutInflater = LayoutInflater.from(context)
    private var reminders = emptyList<Reminders>() // Cached copy of words


        inner class RemindersViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val remindersItemView: TextView = itemView.findViewById(R.id.recycler_item_text)
        val remindersImageView: ImageView = itemView.findViewById(R.id.recycler_item_image)
    }

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): RemindersViewHolder {

        val itemView = inflater.inflate(R.layout.layout_recycler_item,parent,false)
        return RemindersViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: RemindersViewHolder,position: Int) {
        val current = reminders[position]
        holder.remindersItemView.text = current.reminderText
        if (holder.remindersItemView.getText().toString().contains(taskOne)) {
            holder.remindersItemView.setTextColor(Color.parseColor("#FF00B59C"))
            holder.remindersImageView.setimageResource(R.drawable.ic_washing_machine)
        }
        if (holder.remindersItemView.getText().toString().contains(taskTwo)) {
            holder.remindersItemView.setTextColor(Color.parseColor("#EA5455"))
            holder.remindersImageView.setimageResource(R.drawable.ic_iron)
        }
        if (holder.remindersItemView.getText().toString().contains(taskThree)) {
            holder.remindersImageView.setimageResource(R.drawable.ic_shirt)
            holder.remindersItemView.setTextColor(Color.parseColor("#FFFD5900"))
        }
        if (holder.remindersItemView.getText().toString().contains(taskFour)) {
            holder.remindersImageView.setimageResource(R.drawable.ic_dumbbell)
            holder.remindersItemView.setTextColor(Color.parseColor("#8C1BAB"))
        }
        if (holder.remindersItemView.getText().toString().contains(taskFive)) {
            holder.remindersImageView.setimageResource(R.drawable.ic_bathtub)
            holder.remindersItemView.setTextColor(Color.parseColor("#0396FF"))
        }
    }

    override fun getItemCount() = reminders.size

    internal fun setReminders(reminders: List<Reminders>) {
        this.reminders = reminders
        notifyDataSetChanged()
    }

    private val taskOne = "Camasirlar Yikandi"
    private val taskTwo = "Kiyafetler Utulendi"
    private val taskThree = "Kiyafetler Duruldu"
    private val taskFour = "Egzersiz Yapildi"
    private val taskFive = "Banyo Yapildi"

    fun getReminderAt(position: Int) : Reminders {
       return reminders[position]
    }


}

已经感谢您的帮助。

解决方法

我为第二个片段夸大了错误的视图,这就是为什么它似乎不起作用的原因。

关于尺寸问题;由于某些原因更换适配器:

return this.reminders = reminders

return reminders = reminders

并更改片段:

reminderViewModel.delete(RemindersListAdapter(activity as MainActivity).getReminderAt(viewHolder.adapterPosition))

val position = viewHolder.adapterPosition val myReminder: Reminders = adapter!!.getReminderAt(position) reminderViewModel.delete(myReminder)

现在工作很漂亮。