2017-09-26 1 views
1

TV 앱이 있습니다. 나는 채널 목록을보고 그것을 행처럼 만들었다. 하지만 지금은 그리드처럼 재 작성하고 싶습니다. 그리드 발표자를 설정하려고하지만 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를 확장 해 보셨습니까?

는 린백 샘플의 예입니다 : https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/ui/VerticalGridFragment.java

귀하의 구현은 아래에 다음과 유사합니다. MyPresenter은 BaseCardView를 확장하여 ImageCardView 또는 사용자 정의 카드보기와 같은보기를 위임/관리하는 Leanback의 CardPresenter와 같이 Presenter의 하위 클래스 여야합니다. 동적 콘텐츠가 더 많은 경우 각 카드가 다를 수 있도록 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를 사용하는 것보다 낫습니다.

관련 문제