选择跟踪器实现

问题描述 投票:0回答:1

[当我尝试使用选择跟踪器进入回收器视图时,出现了错误,但它不显示我在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) 

查找我的班级定义:

主要活动
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
    }
}

MyLookup
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
}
}

MyAdapter
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)

[当我尝试使用选择跟踪器进入回收器视图时,出现错误,但是它不显示我在SelectionTracker.Builder()函数上遇到的错误类型。我正在关注本教程,我...

java android kotlin android-recyclerview
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.