Как выделить одну строку или элемент Recycler View и прокрутить выделенную строку до верхней части экрана - PullRequest
0 голосов
/ 11 июня 2018

Я хочу выделить один ряд повторяющегося изображения звуком один за другим и прокрутить выделенный ряд в верхнюю часть экрана. Вот что я сделал:

screenshot

Вот егокод:

 fun AnimateToSurahAlFeel(recyclerView: RecyclerView, layoutManager: LinearLayoutManager, currentPosition: Int) {

        var position: Int = currentPosition / 1000


        when (position) {


            0 -> {
                recyclerView.smoothScrollToPosition(0)
                recyclerView.getChildAt(0).isSelected = true

            }
            4 -> {
                recyclerView.smoothScrollToPosition(1)
                recyclerView.getChildAt(0).isSelected = false
                recyclerView.getChildAt(1).isSelected = true
            }
            11 -> {
                recyclerView.smoothScrollToPosition(2)
                recyclerView.getChildAt(1).isSelected = false
                recyclerView.getChildAt(2).isSelected = true
            }
            17 -> {
                recyclerView.smoothScrollToPosition(3)
                recyclerView.getChildAt(2).isSelected = false
                recyclerView.getChildAt(3).isSelected = true
            }
            21 -> {
                recyclerView.smoothScrollToPosition(4)
                recyclerView.getChildAt(3).isSelected = false
                recyclerView.getChildAt(4).isSelected = true
            }
            28 -> {
                recyclerView.smoothScrollToPosition(5)
                recyclerView.getChildAt(4).isSelected = false

                if (recyclerView.getChildAt(5) != null)
                    recyclerView.getChildAt(5).isSelected = true
            }

        }
    }

В функции currentPosition - текущее положение медиаплеера

Проблема в этом коде:

В снимке экрана строки 4 и 5 в настоящее время не видныпри выделении строк 4 и 5 сбой приложения и выдача исключения нулевого указателя, насколько мне известно, эти две строки еще не созданы, поэтому

recyclerview.getChildAt(4) или recyclerview.getChildAt(5) возвращают ноль и вызывают сбой приложения.

Теперь

  1. Как исправить сбой приложения, при котором recyclerview.getchildAt (4) или recyclerview.getchildAt (5) возвращают ноль, а также getChildAt (position) возвращает n-1 строка, поэтому сбой приложения в recyclerview.getchildAt (5) произойдет в любом случае, но я хочу n Row, потому что я хочу выделить все строки

  2. Как прокрутить выделенную строку в положение0 (вверху)то есть строка 0 поднимается вверх от экрана, а строка 1 занимает ее положение и так далее ...

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

picture

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Это потому, что в представлениях переработчика не все завышенные представления, а только видимые.Это по замыслу и не должно быть возиться с.Лично я думаю, что вы должны использовать функцию утилизации.

Вам нужно сделать выбранное состояние частью вашей модели в адаптере - элементы в адаптере.Допустим, это называется RowItem, поэтому в вашем адаптере у вас будет список RowItem s, например.Помимо текста на обоих языках, вам также необходимо добавить выбранное состояние.Тогда нужно просто получить адаптер списка, установить правильное положение для выбранного и отменить выбор нужного.

Например, в вашем адаптере:

fun select(position: Int) {
  data[position].selected = true
  notifyItemChanged(position)
  // deselect all other positions that you don't want selected
}

Когда вы связываетеДержатель просмотра вы можете сделать тогда:

public void onBindViewHolder(ViewHolder viewHolder, int position) {
   val item = data[position]
   viewHolder.itemView.selected = item.selected
   // take care of the rest of the views
}

данные будут список, где вы храните RowItem s

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

Справедливо сказать, что я немного догадываюсь, поскольку в вашем вопросе нет кода адаптера, но идея, которую я думаю, простачтобы понять.Вам нужно изменить состояние в адаптере и позволить реализации представления переработчика справиться с этим за вас.В конце концов, цель состоит в том, чтобы заставить представление переработчика перерабатывать ваши представления на основе моделей, адаптированных адаптером.

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

...
0 -> {
     recyclerView.smoothScrollToPosition(0)
     (recyclerView.adapter as MyAdapter).select(0)
}

Здесь MyAdapter будет именем класса вашего адаптера

Для прокрутки вы можете взятьвзгляд на это

0 голосов
/ 11 июня 2018

Вам нужно время, чтобы View связался.Просто для бывшихВы можете опубликовать действие.

....
 17 -> {
                recyclerView.smoothScrollToPosition(3)
                new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {

                      recyclerView.getChildAt(2).isSelected = false
                      recyclerView.getChildAt(3).isSelected = true
                }, 500);
            }
....

Но я настоятельно рекомендую вам использовать некоторое состояние Collection, которое сохранит и обработает состояния вашего бега и показывает Views.

...