问题描述
我在itemtouchhelper和recyclerview中遇到两个问题。我的主要活动中有两个单独的片段中的回收者视图。
-
我的第一个问题是,即使物品触摸助手非常相同,它也不会滑动或无法用于我的第二个回收器视图。
-
每当我进行滑动删除操作时,都会得到空列表不包含索引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)
现在工作很漂亮。