【问题标题】:Scroll to given position in Android Leanback ListRow滚动到 Android Leanback ListRow 中的给定位置
【发布时间】:2015-07-11 18:48:50
【问题描述】:

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

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

【问题讨论】:

    标签: android android-tv leanback


    【解决方案1】:

    我也有类似的需要:我需要在 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);
        }
    
    }
    

    希望这会对你有所帮助。

    【讨论】:

    • 谢谢,我认为这为我提供了做我想做的事情所需的信息。
    • 例子确实不错,修改第一项后面的逻辑也可以选择。谢谢
    【解决方案2】:

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

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

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

    【讨论】:

    • 我的 onActivityResult 中的同一行代码给出:IllegalStateException:无法启动标题转换;有什么帮助吗?
    【解决方案3】:

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

    我是从 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”。

    【讨论】:

      【解决方案4】:

      此答案建议使用最新的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();
               
              }
      
          }
      
      

      【讨论】:

        【解决方案5】:

        如果您的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是否更新。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          相关资源
          最近更新 更多