15

我在 Android TV 应用程序中使用 Google Leanback 小部件。它使用了一个带有 ListRows 的 RowsFragment。

我要确定的是是否有任何方法可以以编程方式滚动到其中一行中的特定对象。我已经深入研究了 Leanback 小部件的文档,但找不到我要找的东西。

4

5 回答 5

15

我有类似的必要性:我需要在 ListRow 中设置初始选定项。我最终像这样子类化 ListRowPresenter:

import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.RowPresenter;

public class CustomPresenter extends ListRowPresenter {

    private int mInitialSelectedPosition;

    public CustomPresenter(int position) {
        this.mInitialSelectedPosition = position;
    }

    @Override
    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
        super.onBindRowViewHolder(holder, item);

        ViewHolder vh = (ListRowPresenter.ViewHolder) holder;
        vh.getGridView().setSelectedPosition(mInitialSelectedPosition);
    }

}

希望这会对您有所帮助。

于 2015-06-12T14:27:53.343 回答
11

在最新版本的 Leanback(想想 v23.3.0+)中,您现在不仅可以指定行位置,还可以在行上执行可选任务。在您的情况下,任务将是这样的编程选择:

BrowseFragment.setSelectedPosition(0, true, new ListRowPresenter.SelectItemViewHolderTask(2));

无需实现自定义列表行演示者或任何东西

于 2016-06-17T09:33:04.223 回答
6

当我需要实现“按返回返回一行中的第一项”时,我已经完成了它。

我从 Activity 的onBackPressed()调用这个方法。

如果此方法返回false,我们将调用 Activity.super.onBackPressed()。如果是真的- 我们没有。

    public boolean onBackPressed(){
        boolean consumeBack;

        int selectedRowPosition = getRowsFragment().getSelectedPosition();

        ListRowPresenter.ViewHolder selectedRow = (ListRowPresenter.ViewHolder) getRowsFragment().getRowViewHolder(selectedRowPosition);
        int selectedItemPosition = selectedRow.getSelectedPosition();

        if(selectedItemPosition == 0){
            consumeBack = false;
        } else {
            consumeBack = true;
            getRowsFragment().setSelectedPosition(selectedRowPosition, true, new ListRowPresenter.SelectItemViewHolderTask(0));
        }
        return consumeBack;
}

您可以设置您需要的任何位置,而不是“0”。

于 2016-07-26T14:42:19.513 回答
0

这个答案建议使用最新的androidx.leanback库。

在您BrowseSupportFragment创建一个类型的类变量HeadersSupportFragment。创建ArrayObjectAdapter并使用它后setAdapter(),调用getHeadersSupportFragment(). 然后调用getSelectedPosition()获取当前选中的位置并将其存储在Preferences. 稍后,用于setSelectedPosition()设置上一个位置。

这是一个例子:


private HeadersSupportFragment hsp;  
private ArrayObjectAdapter mRowsAdapter;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
        setAdapter(mRowsAdapter);

        hsp = getHeadersSupportFragment();

        int lastPosition = getSharedPreferences(CONTEXT).getInt(LAST_NUMBER, 0);
        hsp.setSelectedPosition(lastPosition);

}

  @Override
    public void onPause() {
        super.onPause();

        if(hsp != null){
            getSharedPreferences(CONTEXT).edit().putInt(LAST_NUMBER, hsp.getSelectedPosition()).commit();
         
        }

    }

于 2021-02-02T08:18:12.363 回答
0

如果您headersState已启用,请使用

SelectItemViewHolderTask task = new SelectItemViewHolderTask(positionX)
boolean isSmoothScroll = false // If you need to ignore the animation
task.setSmoothScroll(isSmothScroll)  
setSelectedPosition(positionY, isSmothScroll, task)

但是,如果您headersState已禁用,则使用此代码将导致异常:IllegalStateException: Cannot start headers transition.
在这种情况下,您需要改用它:

getRowsSupportFragment().setSelectedPosition(positionY, isSmothScroll, task)

它们之间的区别在于是否HeadersSupportFragment更新。

于 2021-08-19T03:36:07.850 回答