RemoteViews ListView setScrollPosition Пропуски - PullRequest
0 голосов
/ 23 сентября 2018

Я работаю над виджетом приложения, который содержит ListView.Я хочу иметь возможность прокручивать его до определенной строки при обновлении, и я использую для этого RemoteViews.setRelativeScrollPosition, но он практически всегда пропускает, либо прокручивая слишком далеко, так что желаемая строка находится на полпути от верха, илинедостаточно далеко, поэтому он находится где-то ниже верхней части виджета.Я хочу, чтобы он располагался прямо вверху виджета.Я попытался использовать setScrollPosition вместо setRelativeScrollPosition, но тогда он вообще не прокручивается (нужная строка все еще отображается, только дальше вниз).

Я делаю что-то не так, что-то пропустилили просто невозможно прокрутить ListView в определенную позицию в виджете?Мне не нужен эффект прокрутки, я был бы рад, если бы он внезапно появился в нужном месте.

Вот мой основной макет виджета:

<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>

ListView заполнен вкод со строками следующего макета:

<?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 Ответ

0 голосов
/ 25 марта 2019

На основе этого ответа мне удалось прокрутить 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);
...