5

我正在使用Android TV的默認項目。下面是我的BrowseFragment創建卡代碼:如何使用ListRowPresenter的setRowViewSelected

private void loadRows() { 
    List<Movie> list = MovieList.setupMovies(); 
    ListRowPresenter mListRowPresenter = new ListRowPresenter(); 
    mRowsAdapter = new ArrayObjectAdapter(mListRowPresenter); 

    mListRowPresenter.setRowViewSelected(/*HOW TO GET VIEWHOLDER HERE?*/, false); 

    CardPresenter cardPresenter = new CardPresenter(); 

    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]); 
     mRowsAdapter.add(new ListRow(header, listRowAdapter)); 
    } 

    setAdapter(mRowsAdapter); 
} 

我這樣做,因爲我不想讓行的第一張牌都被選擇當我啓動應用程序。只有在用戶按下Dpad上的按鈕後才能進行選擇。如果我不能這樣做,我該怎麼做才能獲得提及的行爲?

+1

您可以請求重點關注屏幕上的其他元素 - 如SearchOrb。或者自定義BackgroundManager不總是在背景上顯示圖像。 –

回答

2

您可以setRowViewSelected通過繼承ListRowPresenter和壓倒一切的initializeRowViewHolder(RowPresenter.ViewHolder holder)

@Override 
protected void initializeRowViewHolder(RowPresenter.ViewHolder holder) { 
    super.initializeRowViewHolder(holder); 

    setRowViewSelected(holder, false); 
} 

但我不認爲你可以使用此方法取消選擇在BrowseFragment所有項目。

嘗試在加載數據後設置您的ItemViewSelectedListener,而不是在onActivityCreated中設置爲在首次啓動時取消選擇所有項目。爲什麼排的左上角項目總是會得到默認選擇,你不能有首次推出的所有非選擇項目

可能原因

BrowseFragmentonItemSelected法(line 1372-1382)上首次推出電話mMainFragmentRowsAdapter.getSelectedPosition()

@Override 
    public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 
      RowPresenter.ViewHolder rowViewHolder, Row row) { 
     int position = mMainFragmentRowsAdapter.getSelectedPosition(); //<-- 
     if (DEBUG) Log.v(TAG, "row selected position " + position); 
     onRowSelected(position); 
     if (mExternalOnItemViewSelectedListener != null) { //<-- 
      mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 
        rowViewHolder, row); 
     } 
    } 

getSelectedPosition()那裏總是返回0 (line 483-485

public int getSelectedPosition() { 
     return 0; 
    } 

它還呼籲mExternalOnItemViewSelectedListener.onItemSelected其中mExternalOnItemViewSelectedListener是您在您的應用程序MainFragment設置ItemViewSelectedListener。

所以上首次推出,在第0行第0項被選中作爲默認選擇的項目,但如果延遲設置mExternalOnItemViewSelectedListener這個呼叫不會到達你的項目中選定監聽器第一次。

0

你可以使用這種回調方法。

void onRowViewSelected (RowPresenter.ViewHolder vh, 
        boolean selected) 

當給定的行視圖改變選擇狀態時調用。子類可以覆蓋這個以響應行的選定狀態更改。子類可以對行視圖進行視覺更改,但不能在「行」視圖上創建動畫。

​​

爲什麼最初取消選擇?我沒有得到你的問題顯然你能解釋你想要做什麼?

+0

事情是,當我們啓動這個應用程序,默認情況下,左上角的行將被選中,它的背景圖像將被顯示。我需要做的是,我必須顯示不同的背景圖像,直到用戶選擇任何卡片項目。 – astuter