RemoteViews ListView setScrollPosition Пропуски
Я работаю над виджетом приложения, который содержит 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 );
}
}
0 ответов
Основываясь на этом ответе, мне удалось прокрутить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);