Я очень новичок в библиотеках Leanback. Я хочу разработать Android домашний экран телевизора, где CustomHeaderItem будет с левой стороны, и для каждого HeaderItem будет один ListRow, и вместо BrowseFragment я хочу визуализировать целые вещи в VerticalGridView. Как показано на рисунке ниже.
Чтобы добиться этого, я попытался сохранить 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?
Заранее спасибо:)