java - 选择跟踪器实现

标签 java android kotlin android-recyclerview

当我尝试在回收器 View 中使用选择跟踪器时,出现错误,但它不显示我在 SelectionTracker.Builder() 函数上遇到的错误类型。

我正在关注this我在 android 文档尝试一次后发现了教程,并且在它们两个上都遇到了相同的错误。

Logcat 错误:

  Caused by: java.lang.IllegalArgumentException
        at android.support.v4.util.Preconditions.checkArgument(Preconditions.java:38)
        at androidx.recyclerview.selection.SelectionTracker$Builder.<init>(SelectionTracker.java:508)
        at development.ugly.recviewapp.MainActivity.onCreate(MainActivity.kt:23)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

查找我的类定义:

主要 Activity

import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.widget.LinearLayout
import androidx.recyclerview.selection.SelectionPredicates
import androidx.recyclerview.selection.SelectionTracker
import androidx.recyclerview.selection.StableIdKeyProvider
import androidx.recyclerview.selection.StorageStrategy
import kotlinx.android.synthetic.main.activity_main.*

MainActivity : AppCompatActivity() {

private var tracker: SelectionTracker<Long>? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)



    tracker = SelectionTracker.Builder<Long>("selection-1",
        my_rv,
        StableIdKeyProvider(my_rv),
        MyLookup(my_rv),
        StorageStrategy.createLongStorage()).
        withSelectionPredicate(
            SelectionPredicates.createSelectAnything()).
        build()

    if(savedInstanceState != null)
        tracker?.onRestoreInstanceState(savedInstanceState)


    val myList = listOf(
        Person("Alice", "555-0111"),
        Person("Bob", "555-0119"),
        Person("Carol", "555-0141"),
        Person("Dan", "555-0155"),
        Person("Eric", "555-0180"),
        Person("Craig", "555-0145")
    )

    my_rv.layoutManager = LinearLayoutManager(this)
    my_rv.setHasFixedSize(true)

    var adapter =  MyAdapter(myList, this)

    my_rv.adapter = adapter

    adapter.tracker = tracker
}
}

持有人

package development.ugly.recviewapp

import android.support.v7.widget.RecyclerView
import android.view.View
import android.widget.TextView
import androidx.recyclerview.selection.ItemDetailsLookup
import kotlinx.android.synthetic.main.list_item.view.*

class Holder (view : View): RecyclerView.ViewHolder(view) {

val name: TextView = view.list_item_name
val phone: TextView = view.list_item_phone


fun getItemDetails(): ItemDetailsLookup.ItemDetails<Long> = object : ItemDetailsLookup.ItemDetails<Long>() {
    override fun getSelectionKey(): Long? = itemId

    override fun getPosition(): Int = adapterPosition
    }
}

我的查找

package development.ugly.recviewapp

import android.support.v7.widget.RecyclerView
import android.view.MotionEvent
import androidx.recyclerview.selection.ItemDetailsLookup

class MyLookup(private  val rv: RecyclerView): ItemDetailsLookup<Long>() {

override fun getItemDetails(p0: MotionEvent): ItemDetails<Long>? {

    val view =  rv.findChildViewUnder(p0.x, p0.y)

    if(view != null) {
        return (rv.getChildViewHolder(view) as Holder)
            .getItemDetails()
    }
    return null
}
}

我的适配器

package development.ugly.recviewapp

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
vimport android.view.ViewGroup
import android.widget.LinearLayout
import androidx.recyclerview.selection.SelectionTracker

class MyAdapter(private val list: List<Person>, private val context: Context) : RecyclerView.Adapter<Holder>() {

init {setHasStableIds(true)}

var tracker: SelectionTracker<Long>? = null

override fun getItemId(position: Int): Long = position.toLong()


override fun getItemCount(): Int = list.size


override fun onCreateViewHolder(p0: ViewGroup, p1: Int): Holder = Holder(LayoutInflater.from(context).inflate(R.layout.list_item, p0 ,false))


override fun onBindViewHolder(p0: Holder, p1: Int) {
    p0.name.text = list[p1].name
    p0.phone.text = list[p1].phone
    val parent = p0.name.parent as LinearLayout
}
}

人员类别

package development.ugly.recviewapp

data class Person (val name: String, val phone: String)

最佳答案

将适配器分配给 RecyclerView 后,需要分配跟踪器构建器

关于java - 选择跟踪器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57173969/

相关文章:

android - room db 使用@query 更新多行

kotlin - 为什么记得不将 StateFlow 转换为特定类型?

java - <f : validator> and ajax in JSF 问题

java - StringBuffer 的替换方法无法正常工作

java - 从 R.ID 接收微调器给出 NullPointerException

Android 有时我得到 android.app.RemoteServiceException : Bad notification posted from package. 为什么?

java - 如何检查数组是否为空/空?

android - NestedScrollView 的 smoothScrollTo() 行为怪异

java - 无法解析 TabLayout

kotlin - 如何在 Kotlin 中的 Quarkus 中使用 CDI 字段注入(inject)?