问题描述
我正在尝试在我的应用中使用 recyclerView-Selection
实现 PagedListAdapter
。
问题是当我点击并按住一个项目并进入选择模式时,所有项目都会消失。请参阅此 video 以获得更好的理解。
这是我的代码
// RecyclerView
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0'
// Paging
implementation 'androidx.paging:paging-runtime-ktx:2.1.2'
首页片段
class HomeFragment : Fragment(),AlarmAdapter.OnItemClickListener,AlarmAdapter.OnStateChangeListener {
companion object {
fun newInstance() = HomeFragment()
}
private var tracker: SelectionTracker<Long>? = null
private var _binding: HomeFragmentBinding? = null
private val binding get() = _binding!!
private lateinit var homeViewModel: HomeViewModel
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View {
_binding = HomeFragmentBinding.inflate(inflater,container,false)
val application = requireActivity().application
val dataSource = LocalDatabase.getInstance(application).alarmDao
val homeViewModelFactory = HomeViewModelFactory(dataSource,application)
homeViewModel = ViewModelProvider(
this,homeViewModelFactory
).get(HomeViewModel::class.java)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
val adapter = AlarmAdapter()
adapter.setOnItemClickListener(this)
adapter.setOnStateChangeListener(this)
binding.root.setHasFixedSize(true)
binding.root.adapter = adapter
tracker = SelectionTracker.Builder(
"selection-1",binding.root,ItemIdKeyProvider(binding.root),ItemLookup(binding.root),StorageStrategy.createLongStorage()
).withSelectionPredicate(SelectionPredicates.createSelectAnything())
.build()
if (savedInstanceState != null)
tracker?.onRestoreInstanceState(savedInstanceState)
adapter.setTracker(tracker)
tracker?.addObserver(object : SelectionTracker.SelectionObserver<Long>() {
override fun onSelectionChanged() {
val nItems: Int? = tracker?.selection?.size()
Timber.d("$nItems items selected")
}
})
homeViewModel.getAlarms.observe(viewLifecycleOwner,adapter::submitList)
}
override fun onItemClicked(view: View,position: Int,alarmModel: AlarmModel) {
Timber.d("onItemClicked()")
findNavController().navigate(HomeFragmentDirections.actionHomeToAlarm(alarmModel))
}
override fun onStateChanged(view: View,alarmModel: AlarmModel) {
homeViewModel.update(alarmModel)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
tracker?.onSaveInstanceState(outState)
}
inner class ItemIdKeyProvider(private val recyclerView: RecyclerView) :
ItemKeyProvider<Long>(SCOPE_MAPPED) {
override fun getKey(position: Int): Long {
return recyclerView.adapter?.getItemId(position)
?: throw IllegalStateException("RecyclerView adapter is not set!")
}
override fun getPosition(key: Long): Int {
val viewHolder = recyclerView.findViewHolderForItemId(key)
return viewHolder?.layoutPosition ?: RecyclerView.NO_POSITION
}
}
inner class ItemLookup(private val rv: RecyclerView) : ItemDetailsLookup<Long>() {
override fun getItemDetails(event: MotionEvent)
: ItemDetails<Long>? {
val view = rv.findChildViewUnder(event.x,event.y)
if (view != null) {
return (rv.getChildViewHolder(view) as AlarmAdapter.ViewHolder)
.getItemDetails()
}
return null
}
}
}
报警适配器
class AlarmAdapter : PagedListAdapter<AlarmModel,AlarmAdapter.ViewHolder>(diffCallback) {
companion object {
private val diffCallback = object : DiffUtil.ItemCallback<AlarmModel>() {
override fun areItemsTheSame(
oldItem: AlarmModel,newItem: AlarmModel
): Boolean =
oldItem.id == newItem.id
override fun areContentsTheSame(
oldItem: AlarmModel,newItem: AlarmModel
): Boolean =
oldItem.id == newItem.id
}
}
init {
setHasStableIds(true)
}
private lateinit var mOnItemClickLister: OnItemClickListener
interface OnItemClickListener {
fun onItemClicked(view: View,alarmModel: AlarmModel)
}
fun setOnItemClickListener(listener: OnItemClickListener) {
mOnItemClickLister = listener
}
private lateinit var mOnStateChangeListener: OnStateChangeListener
interface OnStateChangeListener {
fun onStateChanged(view: View,alarmModel: AlarmModel)
}
fun setOnStateChangeListener(listener: OnStateChangeListener) {
mOnStateChangeListener = listener
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): ViewHolder {
return ViewHolder(
AlarmRowLayoutBinding.inflate(
LayoutInflater.from(parent.context),parent,false
).root
)
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun getItemDetails(): ItemDetailsLookup.ItemDetails<Long> =
object : ItemDetailsLookup.ItemDetails<Long>() {
override fun getPosition(): Int = adapterPosition
override fun getSelectionKey(): Long? = itemId
}
}
override fun onBindViewHolder(holder: ViewHolder,position: Int) {
val alarmModel = getItem(position)
alarmModel?.let {
with(AlarmRowLayoutBinding.bind(holder.itemView)) {
val calendar = Calendar.getInstance()
calendar.timeInMillis = alarmModel.time
txtTime.text = "%d:%2d".format(
calendar.get(Calendar.HOUR),calendar.get(Calendar.MINUTE)
)
txtAmpm.text = if (calendar.get(Calendar.AM_PM) == 0) "AM" else "PM"
txtTitle.text = alarmModel.label
swEnable.isChecked = alarmModel.status
swEnable.setOnClickListener {
alarmModel.status = swEnable.isChecked
mOnStateChangeListener.onStateChanged(it,position,alarmModel)
}
root.setOnClickListener {
mOnItemClickLister.onItemClicked(it,alarmModel)
}
tracker?.let {
if (it.isSelected(position.toLong()) ) {
it.select(position.toLong())
//changing the color of the clicked/selected item to light gray
//parent.setBackgroundColor( ContextCompat.getColor(context,R.color.extra_light_gray))
} else {
it.deselect(position.toLong())
// set color white
//parent.setBackgroundColor( ContextCompat.getColor(context,R.color.white))
}
}
}
}
}
private var tracker: SelectionTracker<Long>? = null
fun setTracker(tracker: SelectionTracker<Long>?) {
this.tracker = tracker
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)