2
votes

SelectionTracker ne sélectionne rien dans mon Recyclerview

Lorsque je clique sur les éléments, rien ne se passe J'essaye de changer la couleur, d'afficher le nombre d'éléments sélectionnés, d'afficher les logs Rien ne se passe

MyViewHolder

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    holder.name.text = listItems[position].name
    holder.phone.text = listItems[position].phone

    val parent = holder.name.parent as LinearLayout

    holder.name.setOnClickListener {
        Timber.i("zeze ici")
        if (tracker!!.isSelected(position.toLong())) {
            Timber.i("zeze la")
            parent.background = ColorDrawable(
                Color.parseColor("#80deea")
            )
        } else {
            Timber.i("zeze ${tracker!!.selection}")
            // Reset color to white if not selected
            parent.background = ColorDrawable(Color.WHITE)
        }
    }
}

My ItemDetailsLookup

class MainActivity : AppCompatActivity() {

    private var tracker: SelectionTracker<Long>? = null

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

        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)

        val adapter = PersonAdapter(myList, this)
        my_rv.adapter = adapter

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

        tracker?.addObserver(
            object : SelectionTracker.SelectionObserver<Long>() {
                override fun onSelectionChanged() {
                    val nItems: Int? = tracker?.selection?.size()

                    if (nItems != null && nItems > 0) {

                        // Change title and color of action bar

                        title = "$nItems items selected"
                        supportActionBar?.setBackgroundDrawable(
                            ColorDrawable(Color.parseColor("#ef6c00"))
                        )
                    } else {

                        // Reset color and title to default values

                        title = "RVSelection"
                        supportActionBar?.setBackgroundDrawable(
                            ColorDrawable(Color.parseColor("#126c00"))
                        )
                    }
                }
            })

        adapter.setTracker(tracker)


    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)

        tracker?.onSaveInstanceState(outState)
    }
}

Mon adaptateur

class PersonAdapter(
    private val listItems: List<Person>,
    private val context: Context
) : RecyclerView.Adapter<MyViewHolder>() {

    init {
        setHasStableIds(true)
    }

    private var tracker: SelectionTracker<Long>? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(
            LayoutInflater.from(context)
                .inflate(R.layout.list_item_jf, parent, false)
        )
    }

    override fun getItemCount(): Int {
        return listItems.size
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.name.text = listItems[position].name
        holder.phone.text = listItems[position].phone

        val parent = holder.name.parent as LinearLayout

        if (tracker!!.isSelected(position.toLong())) {
            parent.background = ColorDrawable(
                Color.parseColor("#80deea")
            )
        } else {
            Timber.i("zeze ${tracker!!.selection}")
            // Reset color to white if not selected
            parent.background = ColorDrawable(Color.WHITE)
        }

    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    fun setTracker(tracker: SelectionTracker<Long>?) {
        this.tracker = tracker
    }

}


0 commentaires

3 Réponses :


1
votes

au lieu de cela, il vous suffit d'ajouter un écouteur de clic lorsque vous créez un support de vue:

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

    val myViewHolder = MyViewHolder(
        LayoutInflater.from(context)
            .inflate(R.layout.list_item_jf, parent, false)
    )
    myViewHolder.setOnClickListener {
        // Add what you what you need here
    }
    return myViewHolder
}


0 commentaires

1
votes

Dans mon cas, la solution était de dire à l'utilisateur d'appuyer longuement sur la première sélection:

Appuyez longuement pour le premier paramètre, puis appuyez sur d'autres paramètres pour plusieurs sélection

Mon implémentation était différente mais j'ai également observé que le SelectionTracker ne sélectionnait rien de mon RecyclerView. Je ne pouvais pas comprendre à partir de certains exemple de code SelectionTracker comment il était censé travail. L'exemple a montré comment la surbrillance pouvait être définie lorsqu'un ViewHolder était recyclé:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val number = list[position]
    tracker?.let {
        holder.bind(number, it.isSelected(position.toLong()))
    }
}

fun bind(value: Int, isActivated: Boolean = false) {
    text.text = value.toString()
    itemView.isActivated = isActivated
}

Mais comment isActivated est-il censé être défini sur true lorsque l'utilisateur appuie sur la ligne?

La réponse est que l'utilisateur n'est pas censé appuyer; l'utilisateur est censé appuyer longuement sur:

Pour commencer à sélectionner des éléments, nous devons d'abord activer le mode de sélection multiple en appuyant longuement sur n'importe quel élément.


4 commentaires

comment pourrais-je sélectionner les éléments en un seul clic?


@Andrey Voir ma réponse


pour sélectionner un seul élément, utilisez SelectionPredicates.createSelectSingleAnything () au lieu de SelectionPredicates.createSelectAnything ()


Comment appliquer la sélection uniquement lorsque l'utilisateur appuie longuement sur un élément?



0
votes

Le problème est que la sélection de Recyclerview n'est activée que lorsqu'un élément a été initialement sélectionné, alors vous pouvez sélectionner d'autres éléments en les touchant simplement.

Si vous aurez toujours besoin de l'utilisateur pour sélectionner un élément, ou pour avoir un élément sélectionné, vous pouvez utiliser le selectionTracker pour sélectionner initialement un élément dans la vue de recyclage:

selectionTracker.select(someItemId)

Maintenant, vous pouvez simplement sélectionner d'autres éléments dans la liste en les touchant une seule fois.


0 commentaires