Проигрыватель ListView для Android RemoteViews

Я пытаюсь прокрутить ListView к определенной позиции в AppWidget .

Однако он ничего не делает, я также попробовал метод setPosition, но не работал.

Также нет ошибок или трассировки стека.

Код:

  if (list.size() == 0) { loadLayout(R.layout.rooster_widget_header); views.addView(R.id.header_container, views); } else { views.setRemoteAdapter(R.id.lvWidget, svcIntent); views.setScrollPosition(R.id.lvWidget, 3); } 

Проблема : ListView не имеет дочерних ListView , пока не отобразится. Следовательно, вызов setScrollPosition сразу после установки adpater не влияет. Ниже приведен код в AbsListView, который выполняет эту проверку:

 final int childCount = getChildCount(); if (childCount == 0) { // Can't scroll without children. return; } 

Решение . В идеале я бы использовал ViewTreeObserver.OnGlobalLayoutListener для установки позиции прокрутки ListView , но это невозможно в случае удаленных просмотров. Установите положение прокрутки и вызовите partiallyUpdateAppWidget в runnable с некоторой задержкой. Я изменил код виджета Android и поделился им в git-хабе .

 public class MyWidgetProvider extends AppWidgetProvider { private static HandlerThread sWorkerThread; private static Handler sWorkerQueue; public MyWidgetProvider() { // Start the worker thread sWorkerThread = new HandlerThread("MyWidgetProvider-worker"); sWorkerThread.start(); sWorkerQueue = new Handler(sWorkerThread.getLooper()); } public void onUpdate(Context context, final AppWidgetManager appWidgetManager, int[] appWidgetIds) { for (int i = 0; i < appWidgetIds.length; ++i) { ... final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setRemoteAdapter(R.id.lvWidget, svcIntent); sWorkerQueue.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub views.setScrollPosition(R.id.list, 3); appWidgetManager.partiallyUpdateAppWidget(appWidgetIds[i], views); } }, 1000); appWidgetManager.updateAppWidget(appWidgetIds[i], views); ... } } } 

Вот экранная запись. Он прокручивается до 5-й позиции.

Автоматическая прокрутка ListView в виджетах приложения

Я думаю, что у меня есть решение, я использую его в своем собственном коде. Для получения информации у меня есть несколько страниц и вы хотите показать их по запросу:

 getListView().setSelection(((moreServices-1)*20)+1); 

Для вас это будет:

yourListView.setSelection(3) ;

Надеюсь, поможет…

РЕДАКТИРОВАТЬ

Я думаю, вы должны увидеть, что … это старше, но, возможно, это никогда не менялось

Как сделать прокручиваемый виджет приложения?

У меня есть информация, которая у меня есть, я думаю, что виджет не делает себя недействительным, поэтому он не изменяет его. Поэтому я предлагаю обновить ваш виджет. Есть два способа сделать это, первый из них:

 appWidgetManager.updateAppWidget(widgetId, remoteViews); 

И есть второй способ только в том случае, если у нас нет прямого доступа к AppWidgetManager

 /** * Refresh the views on the widget * NOTE: Use only in case we dont have direct acces to AppWidgetManager */ private void invalidateWidget() { ComponentName widget = new ComponentName(this, YourWidgetProvider.class); AppWidgetManager manager = AppWidgetManager.getInstance(this); manager.updateAppWidget(widget, mRv); } 

Таким образом, изменения должны отражаться в виджетах. Если это не сработает, мне понадобится больше деталей, чтобы выяснить проблему и отредактировать этот ответ. Надеюсь, поможет.

Две вещи:

 views.setScrollPosition(R.id.lvWidget, 3); 

Это правильный вызов. Внутренне setScrollPosition(int, int) вызывает RemoteViews#setInt(viewId, "smoothScrollToPosition", position); ,

 viewId : your ListView's id "smoothScrollToPosition" : method name to invoke on the ListView position : position to scroll to 

Итак, вы вызываете правильный метод.

Ниже приведен комментарий для метода AppWidgetManager#partiallyUpdateAppWidget(int, RemoteViews) – взятый из исходного кода AppWidgetManager.java . Я считаю, что он отвечает на ваш вопрос: ... Use with {RemoteViews#showNext(int)}, {RemoteViews#showPrevious(int)},{RemoteViews#setScrollPosition(int, int)} and similar commands...

 /** * Perform an incremental update or command on the widget specified by appWidgetId. * * This update differs from {@link #updateAppWidget(int, RemoteViews)} in that the RemoteViews * object which is passed is understood to be an incomplete representation of the widget, and * hence is not cached by the AppWidgetService. Note that because these updates are not cached, * any state that they modify that is not restored by restoreInstanceState will not persist in * the case that the widgets are restored using the cached version in AppWidgetService. * * Use with {RemoteViews#showNext(int)}, {RemoteViews#showPrevious(int)}, * {RemoteViews#setScrollPosition(int, int)} and similar commands. * * <p> * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, * and outside of the handler. * This method will only work when called from the uid that owns the AppWidget provider. * * <p> * This method will be ignored if a widget has not received a full update via * {@link #updateAppWidget(int[], RemoteViews)}. * * @param appWidgetId The AppWidget instance for which to set the RemoteViews. * @param views The RemoteViews object containing the incremental update / command. */ public void partiallyUpdateAppWidget(int appWidgetId, RemoteViews views) { partiallyUpdateAppWidget(new int[] { appWidgetId }, views); } 

Как указывает комментарий, вызовите partiallyUpdateAppWidget(appWidgetId, views) после views.setScrollPosition(R.id.lvWidget, 3) .

Комментарий также предупреждает вас: This method will be ignored if a widget has not received a full update via {#updateAppWidget(int[], RemoteViews)} . Это может означать, что следующие вызовы:

 views.setRemoteAdapter(R.id.lvWidget, svcIntent); views.setScrollPosition(R.id.lvWidget, 3); 

Не следует делать в одном обновлении. Я предлагаю вам разбить эти вызовы на два отдельных обновления:

Первый:

 views.setRemoteAdapter(R.id.lvWidget, svcIntent); mAppWidgetManager.updateAppWidget(appWidgetIds, views); 

Во-вторых:

 views.setScrollPosition(R.id.lvWidget, 3); mAppWidgetManager.partiallyUpdateAppWidget(appWidgetId, views); 

Обратите внимание, что первое является полным обновлением, а второе – частичным .

Intereting Posts
Являются ли инструменты gradle: селектор разрешений работает когда-либо? Не удается отправить данные в Galaxy Nexus или из него через LLCP Панель уведомлений серая после реализации Nav Drawer Как я могу управлять звуковыми томами в моем приложении Android? Android – Внеэкранный чертеж из не-пользовательского интерфейса Как запретить Android закрывать веб-приложение при нажатии кнопки? Android-приложение не запускается на эмуляторе Мое приложение Facebook также работает в приложениях iOS / android? Как добавить ярлык приложения на главный экран Пользовательский андроид камеры Проверка электронной почты на EditText – Android Как передать форматированную строку даты из моего DatePickerFragment? Java.lang.ClassNotFoundException: com.android.packageinstaller.InstallFlowAnalytics FirebaseAnalytics.getInstance показывает предупреждение, но успешно компилируется Android – изменение размера изображения с помощью «переопределить» и «fitCenter» деформирует растровое изображение