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 } }
3 Réponses :
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 }
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.
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?
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.