如何将频道列表替换为网格列表?
How to replace list of channels to grid list?
我有一个电视应用程序。我看到了频道列表,我把它排成了一排。但现在我想把它改写成像网格一样。我正在尝试设置网格演示器,但它不起作用,它说我必须实现 MainFragmentAdapterProvider。而且教程中的所有提示都不起作用,我不知道有什么问题。也许还有另一位主持人?
public class ChannelsFragment extends RowsFragment implements OnItemViewClickedListener {
private ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
//private ArrayObjectAdapter mRowsAdapter;
private IServiceControl mServiceControl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mServiceControl = ((A4TVTestApp) getActivity().getApplication()).getServiceControl();
setAdapter(mRowsAdapter);
setOnItemViewClickedListener(this);
createRows();
}
private void createRows() {
// VerticalGridPresenter presenter = new VerticalGridPresenter();
// presenter.setNumberOfColumns(4);
// setGridPresenter(presenter);
// setTitle(getString(R.string.scanned_channels));
//
// setOnItemViewClickedListener(this);
//
// try {
// for (int i = 0; i < mServiceControl.getServiceListCount(0); i++) {
// mRowsAdapter.add(mServiceControl.getServiceDescriptor(0, i).getName());
// }
// } catch (RemoteException e) {
// e.printStackTrace();
// }
ChannelsRowItemPresenter presenter = new ChannelsRowItemPresenter();
ArrayObjectAdapter firstRowAdapter = new ArrayObjectAdapter(presenter);
ArrayObjectAdapter secondRowAdapter = new ArrayObjectAdapter(presenter);
ArrayObjectAdapter thirdRowAdapter = new ArrayObjectAdapter(presenter);
ArrayObjectAdapter fourthRowAdapter = new ArrayObjectAdapter(presenter);
try {
int count = mServiceControl.getServiceListCount(0);
for (int i = 0; i < count; i += 4) {
firstRowAdapter.add(mServiceControl.getServiceDescriptor(0, i));
secondRowAdapter.add(mServiceControl.getServiceDescriptor(0, i + 1));
thirdRowAdapter.add(mServiceControl.getServiceDescriptor(0, i + 2));
fourthRowAdapter.add(mServiceControl.getServiceDescriptor(0, i + 3));
}
} catch (RemoteException e) {
e.printStackTrace();
}
mRowsAdapter.add(new ListRow(new HeaderItem(getString(R.string.scanned_channels)),
firstRowAdapter));
mRowsAdapter.add(new ListRow(secondRowAdapter));
mRowsAdapter.add(new ListRow(thirdRowAdapter));
mRowsAdapter.add(new ListRow(fourthRowAdapter));
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
ServiceDescriptor serviceDescriptor = (ServiceDescriptor) item;
ChannelActivity.startActivity(getActivity(), serviceDescriptor.getLCN());
}
}
您尝试过扩展 VerticalGridFragment 吗?
leanback 示例中有一个示例:
https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/ui/VerticalGridFragment.java
您的实施应类似于以下内容。 MyPresenter
应该是 Presenter 的子类,比如 leanback 中的 CardPresenter,其中 delegates/manages 像 ImageCardView 这样的视图或者你自定义的扩展 BaseCardView 的卡片视图。如果您有更多动态内容,请改用 PresenterSelector 的子类,这样每张卡片都可以不同。
public class ChannelFragment extends android.support.v17.leanback.app.VerticalGridFragment
implements OnItemViewClickedListener {
private static final int NUM_COLUMNS = 5;
private final ArrayObjectAdapter mRowsAdapter;
private IServiceControl mServiceControl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRowsAdapter = new ArrayObjectAdapter(new MyPresenter());
mServiceControl = ((A4TVTestApp) getActivity().getApplication()).getServiceControl();
setAdapter(mRowsAdapter);
setOnItemViewClickedListener(this);
createRows();
}
private void createRows() {
VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
gridPresenter.setNumberOfColumns(NUM_COLUMNS);
// This is the method that will help you get a grid layout.
setGridPresenter(gridPresenter);
setOnItemViewClickedListener(this);
try {
for (int i = 0; i < mServiceControl.getServiceListCount(0); i++) {
mRowsAdapter.add(i);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
ChannelActivity.startActivity(getActivity(), (int) item);
}
}
还有一个 method on ListRowAdapter 来启用每行多行。
ListRowPresenter presenter = new ListRowPresenter()
presenter.setNumRows(4)
ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(presenter);
这比使用 VerticalGridFragment 更好,具体取决于您是否仍需要类别 header。
我有一个电视应用程序。我看到了频道列表,我把它排成了一排。但现在我想把它改写成像网格一样。我正在尝试设置网格演示器,但它不起作用,它说我必须实现 MainFragmentAdapterProvider。而且教程中的所有提示都不起作用,我不知道有什么问题。也许还有另一位主持人?
public class ChannelsFragment extends RowsFragment implements OnItemViewClickedListener {
private ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
//private ArrayObjectAdapter mRowsAdapter;
private IServiceControl mServiceControl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mServiceControl = ((A4TVTestApp) getActivity().getApplication()).getServiceControl();
setAdapter(mRowsAdapter);
setOnItemViewClickedListener(this);
createRows();
}
private void createRows() {
// VerticalGridPresenter presenter = new VerticalGridPresenter();
// presenter.setNumberOfColumns(4);
// setGridPresenter(presenter);
// setTitle(getString(R.string.scanned_channels));
//
// setOnItemViewClickedListener(this);
//
// try {
// for (int i = 0; i < mServiceControl.getServiceListCount(0); i++) {
// mRowsAdapter.add(mServiceControl.getServiceDescriptor(0, i).getName());
// }
// } catch (RemoteException e) {
// e.printStackTrace();
// }
ChannelsRowItemPresenter presenter = new ChannelsRowItemPresenter();
ArrayObjectAdapter firstRowAdapter = new ArrayObjectAdapter(presenter);
ArrayObjectAdapter secondRowAdapter = new ArrayObjectAdapter(presenter);
ArrayObjectAdapter thirdRowAdapter = new ArrayObjectAdapter(presenter);
ArrayObjectAdapter fourthRowAdapter = new ArrayObjectAdapter(presenter);
try {
int count = mServiceControl.getServiceListCount(0);
for (int i = 0; i < count; i += 4) {
firstRowAdapter.add(mServiceControl.getServiceDescriptor(0, i));
secondRowAdapter.add(mServiceControl.getServiceDescriptor(0, i + 1));
thirdRowAdapter.add(mServiceControl.getServiceDescriptor(0, i + 2));
fourthRowAdapter.add(mServiceControl.getServiceDescriptor(0, i + 3));
}
} catch (RemoteException e) {
e.printStackTrace();
}
mRowsAdapter.add(new ListRow(new HeaderItem(getString(R.string.scanned_channels)),
firstRowAdapter));
mRowsAdapter.add(new ListRow(secondRowAdapter));
mRowsAdapter.add(new ListRow(thirdRowAdapter));
mRowsAdapter.add(new ListRow(fourthRowAdapter));
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
ServiceDescriptor serviceDescriptor = (ServiceDescriptor) item;
ChannelActivity.startActivity(getActivity(), serviceDescriptor.getLCN());
}
}
您尝试过扩展 VerticalGridFragment 吗?
leanback 示例中有一个示例: https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/ui/VerticalGridFragment.java
您的实施应类似于以下内容。 MyPresenter
应该是 Presenter 的子类,比如 leanback 中的 CardPresenter,其中 delegates/manages 像 ImageCardView 这样的视图或者你自定义的扩展 BaseCardView 的卡片视图。如果您有更多动态内容,请改用 PresenterSelector 的子类,这样每张卡片都可以不同。
public class ChannelFragment extends android.support.v17.leanback.app.VerticalGridFragment
implements OnItemViewClickedListener {
private static final int NUM_COLUMNS = 5;
private final ArrayObjectAdapter mRowsAdapter;
private IServiceControl mServiceControl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRowsAdapter = new ArrayObjectAdapter(new MyPresenter());
mServiceControl = ((A4TVTestApp) getActivity().getApplication()).getServiceControl();
setAdapter(mRowsAdapter);
setOnItemViewClickedListener(this);
createRows();
}
private void createRows() {
VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
gridPresenter.setNumberOfColumns(NUM_COLUMNS);
// This is the method that will help you get a grid layout.
setGridPresenter(gridPresenter);
setOnItemViewClickedListener(this);
try {
for (int i = 0; i < mServiceControl.getServiceListCount(0); i++) {
mRowsAdapter.add(i);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
ChannelActivity.startActivity(getActivity(), (int) item);
}
}
还有一个 method on ListRowAdapter 来启用每行多行。
ListRowPresenter presenter = new ListRowPresenter()
presenter.setNumRows(4)
ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(presenter);
这比使用 VerticalGridFragment 更好,具体取决于您是否仍需要类别 header。