2017-09-26 124 views
1

我有一個電視應用程序。我看到了頻道列表,我讓它像一排。但現在我想重寫它像一個網格。我試圖設置網格主持人,但它不起作用,它說我必須實現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()); 
    } 
} 

回答

1

您是否試過擴展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,它通過擴展BaseCardView代理/管理像ImageCardView或自定義卡片視圖。如果您擁有更多動態內容,請使用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); 
    } 
} 
+0

參考 1:HTTPS://developer.android.com/reference/android/support/v17/leanback/widget/Presenter.html 2:HTTPS://github.com/googlesamples/androidtv-Leanback/ blob/master/app/src/main/java/com/example/android/tvleanback/presenter/CardPresenter.java 3:https://developer.android.com/reference/android/support/v17/leanback/widget /ImageCardView.html 4:https://developer.android.com/reference/android/support/v17/leanback/widget/BaseCardView.html 5:https://developer.android.com/reference/android /support/v17/leanback/widget/PresenterSelector.html – Benjamin

1

還有一個method on ListRowAdapter使每行有多個行。

ListRowPresenter presenter = new ListRowPresenter() 
presenter.setNumRows(4) 
ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(presenter); 

這比使用VerticalGridFragment更好,具體取決於是否仍需要類別標題。