Android kotlin recyclerview onitemclick

RecyclerView onitemClickListener в Kotlin

Я пишу свое первое приложение в Kotlin после 3 лет опыта работы с Android . Просто запутался в том, как использовать itemClickListener с RecyclerView в Kotlin.

Я попробовал подход черты (edit: now interface), очень похожий на Java

Это казалось излишним, поэтому я попробовал подход внутреннего класса:

А затем просто установите прослушиватель щелчков адаптера следующим образом:

Но я все еще не удовлетворен этим, потому что я думаю, что мог бы быть лучший, более чистый путь. Я пытаюсь по существу достичь что-то вроде этого: RecyclerView onClick

Закончилось вариацией утвержденного ответа

Определены функции в деятельности:

Передал саму функцию на адаптер следующим образом:

Функция расширения Loop в утвержденном ответе ниже.

У меня немного другой подход. Вы можете создать расширение для вашего ViewHolder

Тогда используйте это в адаптере как это

Я работаю со своими коллегами над library , предоставляющим такие расширения.

Мое решение похоже на комбинацию предыдущих с супер чистым вызовом из игры.

ContactAdapter:

ContactActivity:

В случае, если кто-то ищет более no-frills ответ, я попробовал следующее — что очень похоже на решение из AfzalivE :

В моем классе Adapter я передал clickListener в качестве параметра. На onBindViewHolder я использовал setOnClickListener для вызова clickListener и обработки события click.

MyAdapter.kt :

Примечание : мне нужна была ссылка из контейнера моего элемента списка (корневое представление), которое в этом случае является containerView

Затем я передал свой объект в качестве параметра без необходимости повторного поиска в списке и обработки его непосредственно в моем классе Activity , в тот момент, когда я установил адаптер:

MyActivity.kt :

Обновить

Если вам нужно узнать позицию выбранного элемента, просто определите его как параметр в обратном вызове, а затем отправьте его позже. Обратите внимание на val clickListener: (MyObject, Int) -> Unit ниже:

MyAdapter.kt

Затем в onBindViewHolder() вы передаете позицию при вызове метода обратного вызова:

И на MyActivity.kt , вам придется изменить способ установки адаптера, чтобы вы могли получить положение. Как это:

Я думаю, что самое элегантное решение — возложить эту ответственность на recyclerView, а не просматривать или даже адаптировать его.

для этого нам нужно:

1: Создать файл RecyclerItemClickListener

2. Создание/добавление расширений для RecyclerView:

3: И, наконец, использование (я полагаю, вы используете kotlinx)

Вы можете попробовать что-то вроде:

и преобразование SAM просто работает как в Java 8, так что просто используйте лямбду:

Источник

RecyclerView Item Click Listener the Right Way

Some Android developers wonder why Google created a view like Recyclerview without a click listener(given the fact that the deprecated ListView has an item click listener).

Читайте также:  Как отсортировать контакты по дате добавления андроид

Because there is no standard way of setting a click listener, new developers tend to confuse on the right way of doing it. In this article, I will show you how to do it in a proper way using an example scenario.

Example Scenario

  • There is a Recyclerview adapter with a Recyclerview with a list of items(Users in this case).
  • What we want is that when an item is clicked, we get the item’s model(User) information and may be pass it to a second activity.

Project Creation

From Android Studio, create an empty android project(Select the Kotlin support option) and name your activity, MainActivity.

  • Delete the default ‘Hello World’ TextView in activity_main.xml .
  • Add recyclerview and cardview dependencies in app level build.gradle file as shown below.

Add recyclerview in activity_main.xml where you removed the textview as shown below.

Ok we are good to go. The assumption is that you have worked with the recyclerview(in Java) before and know how to create a recyclerview adapter.. Next, we create the model class containing username and phone.

Data model

Sweet Kotlin. Just the above line of code gives us access to a setter and getter under the hood and other methods like toString. Check more at https://kotlinlang.org/docs/reference/data-classes.html .

Next, we create our view holder and adapter. Pay attention here because it is the most important part of what this article addresses.

Recyclerview Adapter and view holder

  • Create a new Kotlin file called RecyclerAdapter.kt
  • Next we create our item_user.xml layout as follows

The item_user has two textviews which holds the name and phone.

Next we create our view holder. As usual, our view holder has a constructor with an itemView as parameter and we get a reference to our views from item_user layout .

Then we create our adapter with the list of users as a parameter. An adapter contains the list of users

Item Click the bad way

Note that in onBindView, we can have access to the the current clicked item and thus open a new activity from here and pass our data..

This will work perfectly but it is a bad practice because

  • It is not a good practice opening an Activity from a viewholder context
  • Note that onBindViewHolder is called as your views are populated during scrolling. Thus you will have numerous calls to setOnClickListener.

Let us fix it

The way that you should do is that you create an ItemClickListener interface with one method ontemClicked with parameter User.

  • We then pass modify the Adapter’s constructor to take the users list and an OnItemClickListener interface
  • We also modify the the ViewHolder to have a bind function which takes a user and itemClick interface as follows.

This is all we have to do. We just have to implement the interface in our MainActivity .

Источник

RecyclerView itemClickListener в Котлине

Я пишу свое первое приложение в Котлине после 3 лет опыта работы с Android. Просто запутался, как использовать itemClickListener с RecyclerView в Котлине.

Читайте также:  Взломать банк с андроида

Я пробовал подход к черте (edit: now interface), очень похожий на Java

это казалось очень избыточным, поэтому я попробовал подход внутреннего класса:

а затем просто установите прослушиватель щелчка адаптера следующим образом:

но я все еще не удовлетворен с этим, потому что я думаю, что может быть лучший, более чистый способ. Я пытаюсь достичь чего-то подобного.: RecyclerView onClick

в конечном итоге происходит с изменением утвержденного ответа

определена функция в действии:

передал саму функцию на адаптер следующим образом:

функция расширения петлей в утвержденном ответе под.

12 ответов

у меня немного другой подход. Вы можете создать расширение для своего ViewHolder

затем используйте его в адаптере, как это

Я работаю с моими коллегами на библиотека обеспечение такого расширения.

мое решение похоже на комбинацию предыдущих с супер чистым вызовом из действия.

ContactAdapter:

ContactActivity:

в случае, если кто-то ищет более без излишеств ответ, я попробовал следующее — что очень похоже на решение от AfzalivE:

в моем классе адаптера я прошел clickListener в качестве параметра. On onBindViewHolder , я использовал setOnClickListener называть clickListener и обрабатывать событие click.

MyAdapter.kt:

Примечание: мне нужна ссылка из контейнера моего элемента списка (корень view), который в этом случае является containerView

затем я передал свой объект как параметр без необходимости искать его в списке снова и обрабатывать его непосредственно на моем Activity класс, в момент установки адаптера:

MyActivity.kt:

обновление

Если вам нужно получить положение щелкнутого элемента, просто определите его как параметр на обратном вызове, а затем отправьте его позже. Обратите внимание на val clickListener: (MyObject, Int) -> Unit ниже:

MyAdapter.kt

затем на onBindViewHolder() вы передаете позицию при вызове метода обратного вызова:

и MyActivity.kt, вам придется изменить способ установки адаптера, чтобы вы могли получить позицию. Вот так:

вы можете попробовать что-то вроде:

и Sam convertion просто работает как в Java 8, поэтому просто используйте лямбда:

Я думаю, что самое элегантное решение-дать эту ответственность recyclerView, а не просматривать или даже адаптировать его.

для этого нам понадобится:

1: создайте файл RecyclerItemClickListener

2: Создание / добавление расширений для RecyclerView:

3: и, наконец, использование (Я полагаю, вы используете kotlinx)

Источник

webserveis / MainActivity.kt

RecyclerView Kotlin onClickListener

Ejemplo de como integrar un recyclerview usando Kotlin, los elementos se mostrarán con filas simples y permite ser pulsados

Añadir funcionalidad onClickListener

Para implementar onClickListener a los elementos que se visualizan en el recyclerView

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

val mAdapter = MySimpleAdapter (dummyData())
recycler_view.setHasFixedSize( true )
recycler_view.layoutManager = LinearLayoutManager ( this , LinearLayoutManager . VERTICAL , false )
recycler_view.adapter = mAdapter
mAdapter.setOnItemClickListener( object : MySimpleAdapter . ClickListener <
override fun onItemClick ( v : View , position : Int ) <
Log .v( TAG , » onItemClick $ » )
Toast .makeText(
this @MainActivity,
» Clicked: $ » ,
Toast . LENGTH_SHORT
).show()
>
>)

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class MySimpleAdapter ( private val mDataSet : List String > ? ) :
RecyclerView . Adapter MySimpleAdapter . MyViewHolder >() <
private var clickListener : ClickListener ? = null
override fun onCreateViewHolder ( parent : ViewGroup , viewType : Int ): MyViewHolder <
val v = LayoutInflater .from(parent.context)
.inflate( R .layout.simple_list_item_1, parent, false )
return MyViewHolder (v)
>
override fun onBindViewHolder ( holder : MyViewHolder , position : Int ) <
val data = mDataSet?.get(position)
data?. let
>
override fun getItemCount (): Int <
return mDataSet?.size ? : 0
>
fun getItem ( position : Int ): String? <
// return if (mDataSet != null) mDataSet[position] else null
return mDataSet?.get(position)
>
fun setOnItemClickListener ( clickListener : ClickListener ) <
this .clickListener = clickListener
>
inner class MyViewHolder ( v : View ) : RecyclerView.ViewHolder(v), View.OnClickListener <
private val text1 = v.findViewById(android. R .id.text1) as TextView
init <
if (clickListener != null ) <
itemView.setOnClickListener( this )
>
>
fun bindItems ( data : String ) <
text1.text = data
>
override fun onClick ( v : View ? ) <
if (v != null ) <
clickListener?.onItemClick(v,adapterPosition)
>
>
>
interface ClickListener <
fun onItemClick ( v : View , position : Int )
>
>

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

RecyclerView itemClickListener в Котлине

Я пишу свое первое приложение в Kotlin после 3-летнего опыта работы с Android.
Просто запутался, как использовать itemClickListener с RecyclerView в Котлине.

Я пробовал подход (edit: now interface), очень похожий на Java

Это казалось очень избыточным, поэтому я попытался использовать внутренний класс:

А затем просто настройте прослушиватель кликов адаптера следующим образом:

Но я все еще не удовлетворен этим, потому что думаю, что может быть лучший, более чистый способ. Я пытаюсь добиться чего-то вроде этого:
RecyclerView onClick

Закончено с изменением одобренного ответа

Определена функция в активности:

Передача самой функции на адаптер так:

Функция расширения с помощью Loop в утверждённом ниже ответе.

У меня есть немного другой подход. Вы можете создать расширение для своего ViewHolder

Затем используйте его в адаптере, как это

Я работаю с коллегами по библиотеке, предоставляя такие расширения.

Мое решение похоже на сочетание предыдущих с супер чистым вызовом из активности.

ContactAdapter:

ContactActivity:

В случае, если кто-либо ищет более беззаботный ответ, я попробовал следующее: это очень похоже на решение от AfzalivE:

В моем классе адаптера я передал clickListener в качестве параметра. В onBindViewHolder я использовал setOnClickListener для вызова clickListener и обработки события click.

MyAdapter.kt

Примечание. Мне нужна ссылка из моего контейнера элементов списка (корневой вид), который в этом случае равен containerView

Затем я передал свой объект как параметр без необходимости повторного поиска его в списке и обработал его непосредственно в моем классе Activity в момент установки адаптера:

MyActivity.kt

Обновление

Если вам нужно получить позицию щелкнутого элемента, просто определите его как параметр в обратном вызове, а затем отправьте его позже. Обратите внимание на val clickListener: (MyObject, Int) -> Unit ниже:

MyAdapter.kt

Затем на onBindViewHolder() вы передаете позицию при вызове метода обратного вызова:

Источник

Читайте также:  Андроид загрузка резервной копии
Оцените статью