2013-01-23 30 views
7

Tôi đã viết một AppWidget hiển thị một số dữ liệu trong một ListView từ một ContentProvider, nhưng tôi gặp khó khăn khi cập nhật nó. Khi tôi lần đầu tiên tạo ra các widget nó được dân cư chính xác, nhưng sau khi PendingIntent của AlarmManager đến, không có cập nhật nào xảy ra trên ListView. Dưới đây là các mã:listviewget appwidget android không cập nhật

Intent update = new Intent(context, MenuWidgetProvider.class); 
update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
PendingIntent pIUpdate = PendingIntent.getBroadcast(context, 0, update, 0); 
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)). 
set(AlarmManager.RTC, nextTime.toMillis(false), pIUpdate); 

Log.d(TAG, "updating: " + dmt.mealName); 

for (int i = 0; i < appWidgetIds.length; ++i) { 
    int widgetId = appWidgetIds[i]; 

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_menu); 
    // meal name 
    views.setTextViewText(R.id.widget_locname, prefs.getString(PREF_WIDGET_LOCNAME, "")); 

    // adapter 
    Intent adapter = new Intent(context, MenuWidgetAdapterService.class); 
    adapter.putExtra(EXTRA_LOCATIONID, prefs.getInt(PREF_WIDGET_LOCID, -1)); 
    adapter.putExtra(EXTRA_MEALNAME, dmt.mealName); 
    adapter.putExtra(EXTRA_DATE, dmt.date.toString()); 
    views.setRemoteAdapter(R.id.widget_list, adapter); 

    // update 
    manager.updateAppWidget(widgetId, views); 
} 

super.onUpdate(context, manager, appWidgetIds); 

Điều lạ là, khi cập nhật xảy ra,() phương pháp onUpdate chạy - Tôi thấy đầu ra từ các cuộc gọi Log.d - nhưng không có cuộc gọi đến onDataSetChanged() trong RemoteViewsFactory của tôi. Ngay cả khi tôi gọi notifyAppWidgetViewDataChanged, không có hiệu lực.

Trả lời

12

Điều này là do RemoteViewsFactory lưu trữ nhà máy nó tạo cho mỗi ID tiện ích con. Do đó, khi cùng một tiện ích gửi yêu cầu tạo một nhà máy mới (thông qua Dịch vụ bộ điều hợp Widget), cùng một nhà máy được trả về. Do đó, chế độ xem danh sách không được "cập nhật".

Làm thế nào tôi làm việc xung quanh nó:

Trong WidgetProviderClass bạn

adapter.setData(Uri.fromParts("content", String.valueOf(appWidgetIds[i]+randomNumber), null)); 

nơi randomNumber là một số ngẫu nhiên (một thành viên tĩnh nào của lớp WidgetProvider của bạn).

Sau đó, trong lớp RemoteViewsFactory của bạn, làm:

appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()) 
      - WidgetProvider.randomNumber; 

này "đánh lừa" Dịch vụ vào suy nghĩ rằng nó có để tạo ra một máy cho widget khác, và do đó, tạo ra một nhà máy mới với các giá trị được cập nhật, được gắn vào widget của bạn.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn! Điều này làm việc cho tôi. – buntwoi

+0

Kỹ thuật này hoạt động nhưng khi tôi ghi nhớ tiểu sử của tiện ích, mức tiêu thụ bộ nhớ tăng lên. Tôi đặt báo thức khoảng một phút cho mục đích gỡ lỗi/lược tả. –

+1

Vấn đề này đã đẩy tôi lên tường. Bạn đã cứu ngày của tôi. Làm thế nào bạn đi qua giải pháp này; chỉ tò mò thôi. Cảm ơn Prateek. –

0

Thậm chí tôi có cùng một vấn đề. RemoteView của widget có vấn đề này.

Giải pháp: Gửi phát sóng cho chính bạn và làm mới lại danh sách. tức là Đặt dữ liệu cho chế độ xem hoàn chỉnh của bạn và sau đó gửi truyền phát đến yopurself.

Hy vọng điều này sẽ giúp

0

Hãy thử số động

Trong WidgetProviderClass của bạn:

int randomNumber=(int)(Math.random()*1000); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId+randomNumber); 

      intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null)); 

      intent.putExtra("random",randomNumber); 
      intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

Và trong lớp RemoteViewsFactory của bạn, làm:

AppWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()); 
Các vấn đề liên quan