我正在使用Google的Leanback小部件在Android TV应用程序中。它利用了一个包含ListRows的RowsFragment。
我尝试确定是否有任何方法可以编程方式滚动到一行中特定对象的位置。我已经查阅了Leanback小部件的文档,但没有找到我要找的内容。
我尝试确定是否有任何方法可以编程方式滚动到一行中特定对象的位置。我已经查阅了Leanback小部件的文档,但没有找到我要找的内容。
我有类似的需求:我需要设置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);
}
}
希望这可以帮助你。
BrowseFragment.setSelectedPosition(0, true, new ListRowPresenter.SelectItemViewHolderTask(2));
当我需要实现“按下返回键返回到行中的第一个项目”时,我已经完成了这个任务。
我是从Activity的onBackPressed()方法中调用这个方法的。
如果这个方法返回false,我们就会调用Activity.super.onBackPressed()。 如果返回true,我们就不会调用。
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"替换为任何需要的位置。
这个答案建议使用最新的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();
}
}
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
。