2017-09-26 4 views
1

Ich habe eine TV-App. Ich sehe eine Liste von Kanälen und ich habe es wie eine Reihe gemacht. Aber jetzt möchte ich es umschreiben wie ein Gitter. Ich versuche, Raster-Presenter zu setzen, aber es funktioniert nicht, es sagt, dass ich MainFragmentAdapterProvider implementieren muss. Und alle Tipps aus Tutorials funktionieren nicht, ich kann nicht herausfinden, was ein Problem ist. Vielleicht gibt es einen anderen Moderator dafür?Wie ersetzt man die Liste der Kanäle der Grid-Liste?

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()); 
    } 
} 

Antwort

1

Haben Sie versucht, VerticalGridFragment zu erweitern?

Es gibt ein Beispiel in dem Leanback Beispiel: https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/ui/VerticalGridFragment.java

Ihre Implementierung dieses unten ähnlich aussehen sollte. MyPresenter sollte eine Unterklasse von Presenter sein, z. B. CardPresenter in der Tabellenansicht, die eine Ansicht wie ImageCardView oder Ihre benutzerdefinierte Kartenansicht durch Erweiterung von BaseCardView delegiert/verwaltet. Wenn Sie mehr dynamischen Inhalt haben, erstellen Sie PresenterSelector stattdessen so, dass jede Karte anders sein kann.

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

Referenzen 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/beispiel/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

Es gibt auch eine method on ListRowAdapter ermöglichen pro Reihe mehrere Zeilen aufweisen.

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

Dies ist besser als die Verwendung einer VerticalGridFragment abhängig davon, ob Sie immer noch die Kategorie Header wollen.

Verwandte Themen