重复问题在此输入链接描述
即使我面临同样的问题,所以我点击应用程序小部件上的imageview,应用程序小部件列表视图应该更新,在我的代码中,当我在onreceive方法中调用更新列表视图时action=UPDATE_ACTION
,它调用updateWidgetListView方法更新小部件但是在我的情况是它没有更新listview,如果我出错了请建议
这是我的代码
package com.wordpress.laaptu; 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.net.Uri; import android.util.Log; import android.view.View; import android.widget.RemoteViews; public class WidgetProvider extends AppWidgetProvider { // String to be sent on Broadcast as soon as Data is Fetched // should be included on WidgetProvider manifest intent action // to be recognized by this WidgetProvider to receive broadcast public static final String DATA_FETCHED = "com.wordpress.laaptu.DATA_FETCHED"; public static String MANIFEST_DEFINED_STRING = "com.refresh.widget"; final static String WIDGET_UPDATE_ACTION ="UPDATE_WIDGET"; AppWidgetManager appWidgetManager; ComponentName currentWidget; /* * this method is called every 30 mins as specified on widgetinfo.xml this * method is also called on every phone reboot from this method nothing is * updated right now but instead RetmoteFetchService class is called this * service will fetch data,and send broadcast to WidgetProvider this * broadcast will be received by WidgetProvider onReceive which in turn * updates the widget */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { final int N = appWidgetIds.length; Log.i("inside", "WidgetProvider"); /* * RemoteViews viewClick = new * RemoteViews(context.getPackageName(),R.layout.widget_layout); * * Intent informationIntent = new Intent(context,info.class); * PendingIntent infoPendingIntent = * PendingIntent.getActivity(context,0, informationIntent, 0); // * viewClick.setOnClickPendingIntent(R.id.txtSeeMore,infoPendingIntent); * * viewClick.setOnClickPendingIntent(R.id.txtSeeMore, * PendingIntent.getBroadcast(context, 0, new Intent(context, * info.class) .setAction("android.intent.category.INFO"), * PendingIntent.FLAG_UPDATE_CURRENT)); */ for (int i = 0; i < N; i++) { Log.i("appWidgetIds", Integer.toString(appWidgetIds[i])); Intent serviceIntent = new Intent(context, RemoteFetchService.class); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); context.startService(serviceIntent); } /* * this.appWidgetManager = appWidgetManager; //this is a onclick event * while no internet connection, currentWidget = new * ComponentName(context, WidgetProvider.class); RemoteViews * defaultRemoteView = new RemoteViews( context.getPackageName(), * R.layout.widget_layout); Intent informationIntent = new * Intent(context, MainActivity.class); PendingIntent infoPendingIntent * = PendingIntent.getActivity(context, 0, informationIntent, 0); * defaultRemoteView.setOnClickPendingIntent(R.id.img_SeeMore, * infoPendingIntent); appWidgetManager.updateAppWidget(currentWidget, * defaultRemoteView); * defaultRemoteView.setEmptyView(R.id.listViewWidget, R.id.empty_view); */ super.onUpdate(context, appWidgetManager, appWidgetIds); } private RemoteViews updateWidgetListView(Context context, int appWidgetId) { Log.i("inside", "updateWidgetListView"); Log.i("appWidgetIds", Integer.toString(appWidgetId)); // which layout to show on widget RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); final Intent refreshIntent = new Intent(context, WidgetProvider.class); refreshIntent .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); refreshIntent.setAction(WidgetProvider.MANIFEST_DEFINED_STRING); /* * final PendingIntent refreshPendingIntent = * PendingIntent.getBroadcast( context, appWidgetId, refreshIntent, * PendingIntent.FLAG_UPDATE_CURRENT); * remoteViews.setOnClickPendingIntent(R.id.img_SeeMore, * refreshPendingIntent); */ // RemoteViews Service needed to provide adapter for ListView Intent svcIntent = new Intent(context, WidgetService.class); // passing app widget id to that RemoteViews Service svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); // setting a unique Uri to the intent // don't know its purpose to me right now svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); // setting adapter to listview of the widget remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget, svcIntent); // setting an empty view in case of no data remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); return remoteViews; } /* * It receives the broadcast as per the action set on intent filters on * Manifest.xml once data is fetched from RemotePostService,it sends * broadcast and WidgetProvider notifies to change the data the data change * right now happens on ListProvider as it takes RemoteFetchService * listItemList as data */ @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); Log.i("inside", "onReceive"); Log.i("getaction", intent.getAction()); if (intent.getAction().equals(DATA_FETCHED)) { Log.i("inside action", "DATA_FETCHED"); int appWidgetId = intent.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); Log.i("appWidgetIds", Integer.toString(appWidgetId)); AppWidgetManager appWidgetManager = AppWidgetManager .getInstance(context); RemoteViews remoteViews = updateWidgetListView(context, appWidgetId); Intent informationIntent = new Intent(context, MainActivity.class); PendingIntent infoPendingIntent = PendingIntent.getActivity( context, 0, informationIntent, 0); remoteViews.setOnClickPendingIntent(R.id.img_SeeMore, infoPendingIntent); Intent widgetIntent = new Intent(context, WidgetProvider.class); widgetIntent.setAction(WIDGET_UPDATE_ACTION); widgetIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); //PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, 0, widgetIntent, 0); PendingIntent widgetPendingIntent = PendingIntent.getBroadcast(context, appWidgetId, widgetIntent, 0); remoteViews.setOnClickPendingIntent(R.id.img_refresh,widgetPendingIntent); // remoteViews.setViewVisibility(R.id.txtSeeMore, View.VISIBLE); /* * RemoteViews newView = new RemoteViews(context.getPackageName(), * R.layout.seemore); newView.setTextViewText(R.id.txt_extra, * "1234"); remoteViews.addView(R.id.lay_title, newView); */ appWidgetManager.updateAppWidget(appWidgetId, remoteViews); } // this is on clickclick event of view more when internet connection is // there // & service running else if (MANIFEST_DEFINED_STRING.equals(intent.getAction())) { Log.i("inside action", "MANIFEST_DEFINED_STRING"); Intent settingIntent = new Intent(context, MainActivity.class); settingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(settingIntent); } else if (WIDGET_UPDATE_ACTION.equals(intent.getAction())) { Log.i("inside action", "WIDGET_UPDATE_ACTION"); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext()); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context.getApplicationContext(), WidgetProvider.class)); for (int i = 0; i < appWidgetIds.length; i++) { Log.i("appWidgetIds", Integer.toString(appWidgetIds[i])); Intent serviceIntent = new Intent(context, RemoteFetchService.class); serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); context.startService(serviceIntent); } //onUpdate(context,appWidgetManager,appWidgetIds); } } /*public static PendingIntent refreshWidget(Context context) { // initiate widget update request Intent intent = new Intent(); intent.setAction(WIDGET_UPDATE_ACTION); return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); }*/ }
这是我运行代码时的logcat
12-12 14:13:53.221: I/inside(5904): WidgetProvider 12-12 14:13:53.221: I/appWidgetIds(5904): 107 12-12 14:13:53.301: I/inside(5904): onReceive 12-12 14:13:53.301: I/getaction(5904): android.appwidget.action.APPWIDGET_UPDATE 12-12 14:13:53.441: I/widgetFor(5904): timeline 12-12 14:13:53.606: W/IInputConnectionWrapper(5904): showStatusIcon on inactive InputConnection 12-12 14:14:05.976: I/inside(5904): RemoteFetchService 12-12 14:14:06.106: I/calling(5904): populateWidget 12-12 14:14:06.106: I/inside(5904): populateWidget 12-12 14:14:06.131: I/inside(5904): onReceive 12-12 14:14:06.131: I/getaction(5904): com.wordpress.laaptu.DATA_FETCHED 12-12 14:14:06.131: I/inside action(5904): DATA_FETCHED 12-12 14:14:06.131: I/appWidgetIds(5904): 107 12-12 14:14:06.131: I/inside(5904): updateWidgetListView
当我点击appwidget的imageview来更新listview时,这里是logcat outut
> 12-12 14:31:59.441: I/inside(11237): onReceive 12-12 14:31:59.441: > I/inside action(11237): WIDGET_UPDATE_ACTION 12-12 14:31:59.441: > I/appWidgetIds(11237): 107 12-12 14:31:59.461: I/widgetFor(11237): > timeline 12-12 14:31:59.791: I/inside(11237): RemoteFetchService 12-12 > 14:31:59.816: I/calling(11237): populateWidget 12-12 14:31:59.816: > I/inside(11237): populateWidget 12-12 14:31:59.841: I/inside(11237): > onReceive 12-12 14:31:59.841: I/getaction(11237): > com.wordpress.laaptu.DATA_FETCHED 12-12 14:31:59.841: I/inside > action(11237): DATA_FETCHED 12-12 14:31:59.841: I/appWidgetIds(11237): > 107 12-12 14:31:59.841: I/inside(11237): updateWidgetListView 12-12 > 14:31:59.841: I/appWidgetIds(11237): 107
所以请帮助,克服这个问题,谢谢..