Найдите позицию строки RecyclerView, просматривая значения RecyclerView

У меня есть RecyclerView, заполненный контентом.

Одно из значений внутри RecyclerView этого Holder — это var entity_id: Int.

Мне нужно было бы перебрать строки RecyclerView, чтобы найти строку, содержащую конкретный entity_id, не зная положения адаптера.

Другими словами, я знаю, что одна из моих строк entity_id равна 23, мне нужно получить adapterPosition этой строки.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вам нужно получить только позицию для значения 23 - вы можете сделать обратный вызов в своем ViewHolder, где вы проверите значение, и если оно будет 23 -> отправить обратный вызов с позицией этого элемента.

Вот как это выглядит ->

Ваш ViewHolder:

 class MyRecyclerViewAdapter(private val callback: (Int) -> Unit) : RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder>() {

   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
   }

   override fun getItemCount(): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
   }

   override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
   }

 inner class MyViewHolder(v: View) : RecyclerView.ViewHolder(v) {

    fun bind(model: Model) {

        TODO("Some logic")

        if (model.id == 23) {
            callback.invoke(adapterPosition)
        }
     }
   }
 }

Модель:

class Model(val id: Int)

Деятельность:

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

    /** Init LayoutManager 
     *  .... 
     * */

    val adapter = MyRecyclerViewAdapter(callback = { position ->
        TODO("Do some logic with your position")
    })
 }

Спасибо, вот близко, когда я давал 23, это было только для примера. Извините, надо было уточнить, что не 23, а "какое-то число"

PhilBlais 29.06.2019 05:26

Можете ли вы объяснить свою задачу еще раз. Потому что тот пример, что я вам посылаю - работает.

Edgar Khimich 29.06.2019 21:28
Ответ принят как подходящий

Прокрутите ваши конечные элементы адаптера и сопоставьте с вашим условием, если элемент найден, то индекс цикла - это позиция вашего элемента адаптера.

private fun getPosition(entityId: Int): Int {
    for (i in list.indices) {
        if (list[i].entity_id == entityId) { //match with your id
            return i
        }
    }
    return -1
}

Другие вопросы по теме