Прокрутите до заданной позиции в Android Leanback ListRow

Я использую виджеты Google Leanback в приложении Android TV. Он использует RowsFragment с ListRows в нем.

Я пытаюсь определить, есть ли способ программно прокрутить до определенного объекта в одной из строк. Я копался в документации по виджетам Leanback, но не смог найти то, что ищу.


person ebr    schedule 01.05.2015    source источник


Ответы (4)


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

import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.RowPresenter;

public class CustomPresenter extends ListRowPresenter {

    private int mInitialSelectedPosition;

    public CustomPresenter(int position) {
        this.mInitialSelectedPosition = position;
    }

    @Override
    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
        super.onBindRowViewHolder(holder, item);

        ViewHolder vh = (ListRowPresenter.ViewHolder) holder;
        vh.getGridView().setSelectedPosition(mInitialSelectedPosition);
    }

}

Надеюсь, это поможет вам.

person GerryP    schedule 12.06.2015
comment
Спасибо, я думаю, что это дает мне информацию, которая мне понадобится, чтобы сделать то, что я хотел. - person ebr; 13.06.2015
comment
Пример действительно хорош, также можно изменить логику выбора первого элемента. Спасибо - person Massimo; 26.09.2016

В последней версии Leanback (думаю, v23.3.0+) теперь вы можете указать не только положение строки, но и выполнять дополнительные задачи в строке. В вашем случае задачей будет программный выбор, например:

BrowseFragment.setSelectedPosition(0, true, new ListRowPresenter.SelectItemViewHolderTask(2));

Нет необходимости реализовывать настраиваемые презентаторы строк списка или что-то в этом роде.

person kip2    schedule 17.06.2016
comment
Та же строка кода в моем onActivityResult дает: IllegalStateException: не удается запустить переход заголовков; любая помощь? - person uniruddh; 22.12.2016

Я сделал это, когда мне нужно было реализовать «Вернуться к первому элементу в строке, нажав «Назад».

Я вызывал этот метод из onBackPressed() Activity.

Если этот метод возвращает false, мы вызываем Activity.super.onBackPressed(). Если true — нет.

    public boolean onBackPressed(){
        boolean consumeBack;

        int selectedRowPosition = getRowsFragment().getSelectedPosition();

        ListRowPresenter.ViewHolder selectedRow = (ListRowPresenter.ViewHolder) getRowsFragment().getRowViewHolder(selectedRowPosition);
        int selectedItemPosition = selectedRow.getSelectedPosition();

        if(selectedItemPosition == 0){
            consumeBack = false;
        } else {
            consumeBack = true;
            getRowsFragment().setSelectedPosition(selectedRowPosition, true, new ListRowPresenter.SelectItemViewHolderTask(0));
        }
        return consumeBack;
}

Вместо «0» вы можете установить любое нужное вам положение.

person Danylo Volokh    schedule 26.07.2016

Этот ответ предлагает использовать последнюю библиотеку androidx.leanback.

В вашем BrowseSupportFragment создайте переменную класса типа HeadersSupportFragment. После создания ArrayObjectAdapter и использования его setAdapter() вызовите функцию getHeadersSupportFragment(). Затем вызовите getSelectedPosition(), чтобы получить текущую выбранную позицию и сохранить ее в Preferences. Позже используйте setSelectedPosition() для установки предыдущей позиции.

Вот пример:


private HeadersSupportFragment hsp;  
private ArrayObjectAdapter mRowsAdapter;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
        setAdapter(mRowsAdapter);

        hsp = getHeadersSupportFragment();

        int lastPosition = getSharedPreferences(CONTEXT).getInt(LAST_NUMBER, 0);
        hsp.setSelectedPosition(lastPosition);

}

  @Override
    public void onPause() {
        super.onPause();

        if(hsp != null){
            getSharedPreferences(CONTEXT).edit().putInt(LAST_NUMBER, hsp.getSelectedPosition()).commit();
         
        }

    }

person taxo    schedule 02.02.2021