2017-02-21 150 views
1

我在Android上遇到Appwidget問題。我有一個listView和一個按鈕,並且Widget的更新週期設置爲30分鐘。 現在我想單擊按鈕時更新listView。我在網上搜索了這個問題,但我還沒有找到解決問題的答案。 在我的代碼中,我必須在onReceived()方法上寫什麼來獲取小部件更新?Android AppWidget更新ListView

我的代碼:

public class WidgetProvider extends AppWidgetProvider { 

private static final String ACTION_UPDATE_CLICK = "click"; 

private Date date; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    final int N = appWidgetIds.length; 

    for (int i = 0; i < N; ++i) { 
     RemoteViews remoteViews = updateWidgetListView(context, 
       appWidgetIds[i]); 

     appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); 
     remoteViews.setOnClickPendingIntent(R.id.bMorgenWidget, 
       getPendingSelfIntent(context, 
         ACTION_UPDATE_CLICK)); 
    } 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 


private PendingIntent getPendingSelfIntent(Context context, String action) { 
    Intent intent = new Intent(context, getClass()); 
    intent.setAction(action); 
    return PendingIntent.getBroadcast(context, 0, intent, 0); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 

    if (ACTION_UPDATE_CLICK.equals(intent.getAction())) { 

    } 
} 

private RemoteViews updateWidgetListView(Context context, int appWidgetId) { 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.widget_layout); 

    Intent svcIntent = new Intent(context, WidgetService.class); 
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget, 
      svcIntent); 
    remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); 
    return remoteViews; 
} 
} 

回答

0

我面臨同樣的問題。我想知道如何強制更新我的小部件中的數據和用戶界面。

我找到了解決方法是使用一個公共靜態的內部服務:

/** 
* Update Big Widget Service 
*/ 
public static class WidgetBigUpdateService extends Service 
{ 
    public WidgetBigUpdateService() 
    { 
     super(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     Context context = getBaseContext(); 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass())); 
     RemoteViews bigWidgetView = new RemoteViews(context.getPackageName(), R.layout.widget_big_layout); 
     refreshBigWidgetData(context, appWidgetManager, appWidgetIds, bigWidgetView); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 
} 

的方法 refreshBigWidgetData(context, appWidgetManager, appWidgetIds, bigWidgetView); 屬於小部件,並負責我的小部件的UI更新:

/** 
* Asks for Big Widget Updates 
* 
* @param context 
*/ 
private void widgetBigForceUpdate(Context context) 
{ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass())); 
    onUpdate(context, appWidgetManager, appWidgetIds); 
} 

正如你所看到的,它通過context,appWidgetManager和appWidgetId調用函數onUpdate()。這個代碼是100%的工作,我毫不懷疑你可以適應你的具體使用。

希望這會有所幫助