代码之家  ›  专栏  ›  技术社区  ›  Khantahr

远程视图ListView setScrollPosition未命中

  •  0
  • Khantahr  · 技术社区  · 6 年前

    我正在开发一个包含ListView的应用程序小部件。我想能够让它滚动到一个特定的行刷新时,我正在使用 RemoteViews.setRelativeScrollPosition 这样做,但它几乎总是错过,要么滚动太远,使所需的行是一半的顶部,或不够远,所以它在下面的小部件顶部的某个地方。我希望它排在小部件的正上方。我试过用 setScrollPosition 而不是 setRelativeScrollPosition ,但它根本不会滚动(所需的行仍会显示,只是再向下一些)。

    以下是我的主要小部件布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_height="match_parent"
              android:layout_width="match_parent"
              android:orientation="vertical"
              android:padding="@dimen/widget_margin"
              style="@style/AppTheme.WidgetMain">
    
    <RelativeLayout android:id="@+id/title_layout"
        android:layout_height="wrap_content"
        android:layout_margin="1dp"
        android:layout_width="match_parent"
        style="@style/AppTheme.Title.Background">
        <TextView android:id="@+id/appwidget_title"
                  android:contentDescription="@string/appwidget_title"
                  android:layout_alignParentStart="true"
                  android:layout_centerVertical="true"
                  android:layout_height="wrap_content"
                  android:layout_margin="1dp"
                  android:layout_toStartOf="@+id/button_refresh"
                  android:layout_width="wrap_content"
                  android:paddingEnd="2dp"
                  android:paddingStart="2dp"
                  android:text="@string/appwidget_title"
                  style="@style/AppTheme.Title" />
        <ImageButton android:id="@+id/button_refresh"
                     android:contentDescription="@string/button_refresh"
                     android:layout_centerVertical="true"
                     android:layout_height="wrap_content"
                     android:layout_marginEnd="20dp"
                     android:layout_toStartOf="@id/button_settings"
                     android:layout_width="wrap_content"
                     android:src="@drawable/ic_refresh"
                     style="@style/AppTheme.WidgetMain.Button" />
        <ImageButton android:id="@+id/button_settings"
                     android:contentDescription="@string/button_settings"
                     android:layout_alignParentEnd="true"
                     android:layout_centerVertical="true"
                     android:layout_height="wrap_content"
                     android:layout_marginEnd="10dp"
                     android:layout_width="wrap_content"
                     android:src="@android:drawable/ic_menu_preferences"
                     style="@style/AppTheme.WidgetMain.Button" />
    </RelativeLayout>
    
    <LinearLayout android:id="@+id/header_layout"
        android:layout_height="wrap_content"
        android:layout_marginEnd="1px"
        android:layout_marginStart="1px"
        android:layout_width="match_parent"
        android:orientation="horizontal"
        style="@style/AppTheme.Background" />
    
    <ListView android:id="@+id/grid"
              android:divider="@null"
              android:layout_gravity="center"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:layout_width="match_parent"
              android:scrollbars="none" />
    
    </LinearLayout>
    

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/box"
              android:clipChildren="false"
              android:clipToPadding="false"
              android:layout_gravity="fill"
              android:layout_height="83dp"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:orientation="vertical"
              style="@style/AppTheme.Background">
    
    </LinearLayout>
    

    然后,我在我的 RemoteViewsService 包括以下内容:

    @Override
        public void onDataSetChanged()
        {
            /* Scroll the view if the option is checked */
            if ( _context.getSharedPreferences(
                MainPreferencesFragment.getSharedPreferencesFileName( _appWidgetId ),
                Context.MODE_PRIVATE ).
                getBoolean( MainPreferencesFragment.PREF_KEY_SCROLL, false ) )
                {
                    /* Set up the handler thread */
                    final HandlerThread thread = new HandlerThread( "Widget-worker" );
                    thread.start();
                    Handler queue = new Handler( thread.getLooper() );
                    /* Post a delayed action to the thread to set the scroll position */
                    queue.postDelayed( new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            String packageName = _context.getPackageName();
                            RemoteViews rv = new RemoteViews( packageName, R.layout.widget );
                            rv.setRelativeScrollPosition( R.id.grid, _currentPosition );
                            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance( _context );
                            appWidgetManager.partiallyUpdateAppWidget( _appWidgetId, rv );
                            thread.quitSafely();
                        }
                    }, 100 );
                }
        }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   descatalogado    5 年前

    基于 this response ,我设法滚动 ListView RemoteViews 使用两步方法来正确对齐位置:首先更新小部件,然后使用 Handler partiallyUpdateAppWidget .

    在你的 AppWidgetProvider onUpdate 方法:

    appWidgetManager.notifyAppWidgetViewDataChanged(widgetId, R.id.widget_list);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            appWidgetManager.updateAppWidget(widgetId, remoteViews);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    remoteViews.setScrollPosition(R.id.widget_list, scrollPosition);
                    appWidgetManager.partiallyUpdateAppWidget(widgetId, remoteViews);
                }
            }, 5000);
        }
    }, 5000);