2012-07-05 34 views
11

Tôi có appwidget sử dụng ListView. Tôi đã tạo ra một lớp mà kéo dài RemoteViewsService:onGetViewFactory chỉ được gọi một lần cho nhiều tiện ích

public class AppWidgetService extends RemoteViewsService { 
    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     return (new AppWidgetListFactory(this.getApplicationContext(), intent)); 
    } 
} 

Trong tôi AppWidgetProvider, tôi gọi là phương pháp sau đây cho mỗi trường hợp của các widget (đối với từng appWidgetId):

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) { 
    Intent intent = new Intent(context, AppWidgetService.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    widget.setRemoteAdapter(R.id.appwidget_listview, intent); 
} 

Các constructor của AppWidgetListFactory

public AppWidgetListFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    System.out.println("New TVAPWLF for: " + appWidgetId); 
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId); 
} 

Bây giờ vấn đề là,Phương thức 210 được gọi thường xuyên như có các trường hợp của tiện ích, nhưng phương thức onGetViewFactory chỉ được gọi một lần. Điều này dẫn đến tất cả các tiện ích hiển thị cùng một dữ liệu.

Làm cách nào để khắc phục sự cố này?

+0

bạn có thể thêm một số mã nữa không? nó làm việc nếu bạn làm cho phương thức 'fillInList' không tĩnh? – Ronnie

+0

Trong trường hợp của tôi intent.putExtra không hoạt động. Mỗi trường hợp tôi nhận được id tiện ích cần thiết chính xác. –

Trả lời

24

Tôi chưa tự mình thử nghiệm, nhưng nhìn vào mã nguồn cho RemoteViewsService.onBind(), tôi tin rằng bạn không chỉ thay đổi các tính năng bổ sung trong Mục đích của mình để phát hiện ra một cuộc gọi mới đến phương thức onGetViewFactory() của bạn. nó sử dụng phương pháp Intent.filterEquals() để so sánh:

Xác định xem hai ý định có giống nhau nhằm mục đích phân giải ý định (lọc) hay không. Nghĩa là, nếu hành động, dữ liệu, loại, lớp và danh mục của họ giống nhau. Điều này không so sánh bất kỳ dữ liệu bổ sung nào có trong mục đích.

tôi sẽ đề nghị đi qua các thông tin mà bạn cần (id phụ tùng?) Thông qua dữ liệu của Ý định thay vào đó, có lẽ cái gì đó như:

private static void fillInList(RemoteViews widget, Context context, int appWidgetId) { 
    Intent intent = new Intent(context, AppWidgetService.class); 
    intent.setData(Uri.fromParts("content", String.valueOf(appWidgetId), null)); 
    widget.setRemoteAdapter(R.id.appwidget_listview, intent); 
} 

và tương ứng ở phía bên nhận:

public TreinVerkeerAppWidgetListFactory(Context context, Intent intent) { 
    this.context = context; 
    appWidgetId = Integer.valueOf(intent.getData().getSchemeSpecificPart()); 

    System.out.println("New TVAPWLF for: " + appWidgetId); 
    trains = WidgetData.getInstance().widgetMap.get(appWidgetId); 
} 
+1

Điều đó đã thực sự lừa, cảm ơn rất nhiều! – nhaarman

+0

@ Joe có thể vui lòng kiểm tra làm thế nào để làm điều này trong mã của tôi, thực sự tôi đã thực hiện những thay đổi như u nói nhưng bây giờ nó bị treo. Đây là mã của tôi http://pastie.org/7063960 và đây là logcat http://pastie.org/7063968 – AndroidDev

+0

@Anshuman Tôi thấy một vấn đề trên dòng 36 trên pastie đầu tiên của bạn: 'String.valueOf (appWidgetIds)' . Ở đây 'appWidgetIds' là một mảng thay vì một số nguyên duy nhất và nó tạo ra một URI không hợp lệ trong mục đích (giống như" [I @ 424b7d58 "thay vì" 2 "). Bạn có nghĩa là để viết 'String.valueOf (appWidgetIds [0])' thay vào đó? – Joe

Các vấn đề liên quan