Изменить внешний вид одного представления в ListView - PullRequest
0 голосов
/ 01 сентября 2018

Я работаю над музыкальным приложением. Я хочу полужирный информацию о песне, которая воспроизводится в данный момент (например, Google Play Music). Существует ListView всех песен, заполненный RelativeLayout информации о песне для каждой песни. Песня воспроизводится либо нажатием на ListView (который может воспроизводить любую песню), либо нажатием предыдущей или следующей (которая будет воспроизводить соседнюю песню).

Я не хочу использовать ScrollView, потому что в библиотеке песен может отображаться очень большое количество записей.

Мне нужно уметь

  • редактирование видов на основе заданной позиции, которая может быть вне экрана
  • держите один конкретный вид жирным шрифтом независимо от того, находится ли он на экране или нет (например, я не могу по умолчанию для представлений использовать Typeface.NORMAL, потому что прокрутка и возврат к песне сбросит его)
  • возвращает ранее воспроизведенную песню в нормальное состояние после завершения воспроизведения

Я посмотрел исходный код GPM здесь , но я не мог сказать, где это происходит. Любая помощь будет принята с благодарностью:)

1 Ответ

0 голосов
/ 01 сентября 2018

Независимо от того, используете ли вы ListView или RecyclerView, общий шаблон решения будет одинаковым: вам следует сохранить ссылку либо на (a) индекс «в данный момент играет», либо (b) на «текущий» игра "элемент данных.

Давайте посмотрим, каким было бы решение, если бы вы использовали ListView и сохранили индекс «играющих в данный момент».

Шаг первый будет некоторой переменной, чтобы сохранить то, что в данный момент воспроизводится. Возможно, вы используете int и трактуете специальное значение -1 как означающее, что ничего не играет.

private int currentlyPlayingPosition;

Всякий раз, когда вы меняете какую-либо песню, которая воспроизводится в данный момент, вы обновляете сохраненное здесь значение (возможно, ++currentlyPlayingPosition, когда пользователь нажимает «следующая песня» и т. Д.). Затем вам также придется позвонить adapter.notifyDataSetChanged(), чтобы сказать ListView, чтобы он перерисовал себя так, чтобы изменилась жирная песня.

В вашем методе getView() вы можете проверить, является ли чертеж, который вы рисуете, «исполняемой в данный момент» песней, и изменить шрифт на основе этого:

@Override
public View getView(int position, View convertView, ViewGroup container) {
    ...
    if (position == currentlyPlayingPosition) {
        textView.setTypeface(textView.getTypeface(), Typeface.BOLD);
    } else {
        textView.setTypeface(textView.getTypeface(), Typeface.NORMAL);
    }
    ...
}

Общие шаги относительно просты:

  • Отслеживание песни, которая воспроизводится в данный момент (по индексу, по ссылке на объект или другим способом)
  • Каждый раз, когда изменяется текущая воспроизводимая песня, сообщите об этом адаптеру.
  • Внутри getView() проверьте, является ли отображаемая песня текущей исполняемой песней, и покажите специальный пользовательский интерфейс, если это так
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...