Как автоматически продвигать виджет приложения ListView, такой как виджеты приложения StackView на Honeycomb? - PullRequest
3 голосов
/ 15 июня 2011

Я ищу способ периодически анимировать / автоматически продвигать виджет приложения ListView, как это делается с виджетами приложения StackView.

Например, виджеты Android Market и YouTube анимируют каждые 20 секунд, автоматически переходя к следующему элементу в коллекции (в сотах).

Я видел в примере виджета StackView , что они используют параметр autoAdvanceViewId для виджета StackView:

<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minWidth="150dip"
  android:minHeight="150dip"
  android:updatePeriodMillis="3600000"
  android:previewImage="@drawable/preview"
  android:initialLayout="@layout/widget_layout"
  android:autoAdvanceViewId="@id/stack_view">
</appwidget-provider>


Можно ли это сделать или каким-либо образом эмулировать для виджета приложения ListView?

Большое спасибо,
Laurent

1 Ответ

6 голосов
/ 17 июня 2011

Я нашел одно решение, но оно может быть не идеальным!

Я установил повторяющийся сигнал в onEnable () AppWidgetProvider и отменил его в onDisabled ().Этот сигнал тревоги вызывает BroadcastReceiver, который обновляет представления виджетов и использует setRelativeScrollPosition () в RemoteView.

Вот несколько строк кода:

  • В классе расширяется AppWidgetProvider

    public void onEnabled(Context context) {
        [...]
      // create alarm that will move the widget list content every n seconds
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    
      long firstTime = SystemClock.elapsedRealtime();
      firstTime += 10*1000;
    
      Intent i = new Intent(context, WidgetAutoScroller.class);
      PendingIntent widgetAutoScroll = PendingIntent.getBroadcast(context, 0, i, 0);
      alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 
            10*1000, widgetAutoScroll);
      super.onEnabled(context);
    }
    
    @Override
    public void onDisabled(Context context) {
      // deactivate the alarm that moves the widget content 
      Intent i = new Intent(context, WidgetAutoScroller.class);
      PendingIntent widgetAutoScroll = PendingIntent.getBroadcast(context, 0, i, 0);
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      alarmManager.cancel(widgetAutoScroll);
      super.onDisabled(context);
    }
    
  • WidgetAutoScroller.java

public class WidgetAutoScroller extends BroadcastReceiver {</p> <pre><code> @Override public void onReceive(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, CascadeWidgetProvider.class)); for( int i=0 ; i<appWidgetIds.length ; i++) { int appWidgetId = appWidgetIds[i]; RemoteViews rv = CascadeWidgetProvider.getWidgetView(context, appWidgetId); rv.setRelativeScrollPosition(R.id.widget_collection, 1); appWidgetManager.updateAppWidget(appWidgetId, rv); } } }

Если у вас есть лучшее решение моей проблемы, пожалуйста, ответьте.

РЕДАКТИРОВАТЬ : Еще одна проблема: что делать, когда я достигаю конца моегосписок?Я хотел бы перейти к первому элементу списка, но я не знаю, как получить текущую позицию списка из моего RemoteView или appWidgetId ...

...