Как установить HeaderItem на левой стороне, используя VerticalGridView, как Android Главный экран телевизора - PullRequest
0 голосов
/ 01 апреля 2020

Я очень новичок в библиотеках Leanback. Я хочу разработать Android домашний экран телевизора, где CustomHeaderItem будет с левой стороны, и для каждого HeaderItem будет один ListRow, и вместо BrowseFragment я хочу визуализировать целые вещи в VerticalGridView. Как показано на рисунке ниже.

enter image description here

Чтобы добиться этого, я попытался сохранить ImageView с HorizontalGridView и оба представления, которые я рендерил в VerticalGridView.

При этом фокус перемещается от imageView к соответствующему HorizontalGridView при нажатии правой клавиши dpad, что является ожидаемым поведением, но возврата из соответствующего HorizontalGridView к соответствующему ImageView не происходит.

row_grid_view_renderer. xml:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:lb="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
    android:id="@+id/header_icon"
    android:layout_width="300dp"
    android:paddingBottom="50dp"
    android:layout_height="150dp"
    android:layout_gravity="center"
    android:gravity="center"
    android:focusable="true"
    android:layout_weight="1"
    android:clickable="true"
    android:background="@drawable/selector_bg_card"
    android:focusableInTouchMode="true" />
<androidx.leanback.widget.HorizontalGridView
  android:id="@+id/row_grid_view"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:focusable="true"
  android:layout_gravity="center"
  android:focusableInTouchMode="true"
  android:layout_weight="2"
  lb:horizontalMargin="12dip"
  lb:verticalMargin="24dip"
  lb:numberOfRows="3"
  lb:rowHeight="150dip" />
</LinearLayout>

main_grid_view_rendere. xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<androidx.leanback.widget.VerticalGridView
    android:id="@+id/parent_grid_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</LinearLayout>

Ниже я переопределяю метод createRowViewHolder () класса ListRowPresenter для установки imageView и HorizontalGridView.

public class CustomListRowPresenter extends ListRowPresenter {
private static final String TAG = CustomListRowPresenter.class.getSimpleName();
private static final boolean DEBUG = true;
private CustomListRowView rowView;

public CustomListRowPresenter() {
    super();
}

public RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
    rowView = new CustomListRowView(parent.getContext(),null,-1);
    rowView.getImageView().setImageResource(R.drawable.ic_blur_on_black_24dp);
    return new ViewHolder(rowView,  rowView.getRowGridView() , this);
}

А вот мой класс MainActivity, который рендерит ImageView и HorizontalGridView внутри main_grid_view (который содержит VerticalGridView).

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_grid_view);
    mVerticalGridView = (VerticalGridView) findViewById(R.id.parent_grid_view);
    loadRows();
}
private void loadRows() {
    cardPresenter = new CardPresenter();
    rowsAdapter = new ArrayObjectAdapter(new CustomListRowPresenter());
    List<Movie> list = MovieList.setupMovies();

    int i;
    for (i = 0; i < NUM_ROWS; i++) {
        if (i != 0) {
            Collections.shuffle(list);
        }
        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
        for (int j = 0; j < NUM_COLS; j++) {
            listRowAdapter.add(list.get(j % 5));
        }
        HeaderItem header = new HeaderItem(i, MovieList.MOVIE_CATEGORY[i]);
        rowsAdapter.add(new CustomListRow(header, listRowAdapter));
    }
    ItemBridgeAdapter itemBridgeAdapter = new ItemBridgeAdapter(rowsAdapter);
    mVerticalGridView.setAdapter(itemBridgeAdapter);
}

Я хочу получить фокус в обоих соответствующих представлениях, нажимая правую и левую клавиши Dpad. Как я достигну вышеупомянутого сценария или где я иду не так? А также, Как остановить переход заголовка внутри BrowseFragment?

Заранее спасибо:)

...