【问题标题】:Listivew Widget not updating automaticallyListview Widget 不会自动更新
【发布时间】:2013-08-30 04:32:31
【问题描述】:

我的朋友已经完成了一个应用程序,现在他为他的应用程序创建了一个小部件,可用于以列表视图的方式显示任务列表。首先,当他拖动小部件并安装在主屏幕上时,它会正常工作并以列表视图的方式显示任务。

他的问题是,当他在应用程序中进行更改然后返回主屏幕时,没有反映任何更改。他正在为此使用onReceive() 方法来更新小部件

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.util.Log;
import android.widget.RemoteViews;

public class WidgetTaskSchedular extends AppWidgetProvider {
    private final String TAG = "CalendarViewSample:"
            + this.getClass().getName();

    SharedPreferences sharedprefer;

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if(intent.getAction().equals("update_widget"))
        {
            int[] appid=new int[1];
            sharedprefer=context.getSharedPreferences("TaskWidget", 0);
            appid[0]=sharedprefer.getInt("widget_key",0);
            Log.i(TAG,"Appwidgetid"+appid[0]);
            onUpdate(context, AppWidgetManager.getInstance(context),appid);

        }
    }
    public static String EXTRA_WORD=
            "com.capsone.testing.calendar.WORD";
    @SuppressWarnings("deprecation")
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
         for (int i=0; i<appWidgetIds.length; i++) {

             sharedprefer=context.getSharedPreferences("TaskWidget", 0);
             SharedPreferences.Editor editor=sharedprefer.edit();
             editor.putInt("widget_key", appWidgetIds[i]);
             editor.commit();
             int a= sharedprefer.getInt("widget_key", 0);
             Log.i(TAG,"Sharedpreferencewidgetid:"+a);

              //ID=appWidgetIds[i];
              Log.i(TAG,"LengthofWidget:"+appWidgetIds.length);
             // Log.i(TAG,"TestAppWidget:"+ID);
              Intent intentWidgetService=new Intent(context, WidgetService.class);
              intentWidgetService.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
              intentWidgetService.setData(Uri.parse(intentWidgetService.toUri(Intent.URI_INTENT_SCHEME)));

              RemoteViews remoteView=new RemoteViews(context.getPackageName(),
                                                  R.layout.widgetlayout);

              remoteView.setRemoteAdapter(appWidgetIds[i], R.id.listWidget,
                                      intentWidgetService);

              Intent clickIntent=new Intent(context, ActionBarActivity.class);
              PendingIntent clickPendingIntent=PendingIntent
                                      .getActivity(context, 0,
                                                    clickIntent,
                                                    PendingIntent.FLAG_UPDATE_CURRENT);
              remoteView.setPendingIntentTemplate(R.id.listWidget, clickPendingIntent);
             ComponentName component=new ComponentName(context,WidgetTaskSchedular.class);
              appWidgetManager.updateAppWidget(component, remoteView);
            }

    }
}

【问题讨论】:

    标签: android widget auto-update


    【解决方案1】:

    我建议你试试下面粘贴的代码:

    ComponentName component=new ComponentName(context,WidgetTaskSchedular.class);
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.listWidget);
    appWidgetManager.updateAppWidget(component, remoteView);
    

    notifyAppWidgetViewDataChanged() --->通知所有指定AppWidget 实例中的指定集合视图使其当前数据无效。

    因此,当您调用 notifyAppWidgetViewDataChanged() 时,将调用 RemoteViewsFactoryonDataSetChanged() 方法,该方法用作您的 ListView 的适配器。您可以在onDataSetChanged() 中执行与网络服务/网络相关的操作、从数据库中获取数据的操作和其他操作,获取响应并将其添加到您的数据集中,可能是ArrayList 或任何此类Collection

    您可以参考Using App Widgets with Collections

    【讨论】:

      【解决方案2】:

      您是否尝试过这里提到的解决方案:

      How to update a Widget dynamically (Not waiting 30 min for onUpdate to be called)?

      请注意,以上只是触发更新,小部件本身将需要获取所需的数据。

      请注意,虽然广播接收器可以在小部件中注册,但在更新后,它们会被垃圾收集,因此不是可靠的解决方案。

      最后一种选择是注册一个 AlarmManager 来触发一个执行小部件更新的服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 2015-07-08
        • 2019-02-20
        • 2021-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多