2013-08-30 5 views
3

Мой друг выполнил одно приложение, и теперь он создал один виджет для своего приложения, который может использоваться для отображения списка задач в режиме просмотра списка. Сначала, когда он перетаскивает виджет и устанавливает его на начальном экране, он будет работать нормально, а также отображать задачу в режиме просмотра списка.Listivew Widget не обновляется автоматически

Его проблема в том, что он внес изменения в свое приложение, а затем вернулся на свой главный экран, никаких изменений не отразилось. Он использует 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); 
      } 

    } 
} 

ответ

6

Я предлагаю вам попробовать код вставил ниже:

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

notifyAppWidgetViewDataChanged() ---> Уведомляет указанный вид сбора во всех указанных случаях AppWidget недействительными их в настоящее время данные.

Итак, когда вы звоните notifyAppWidgetViewDataChanged() то onDataSetChanged() метод RemoteViewsFactory будет называться, который служит в качестве адаптера для вашего ListView. Вы можете выполнять операции с веб-сервисом/сетью, получать данные из базы данных и другие операции в onDataSetChanged(), получать ответ и добавлять его в свой набор данных, который может быть ArrayList или любой такой Collection.

Вы можете обратиться к Using App Widgets with Collections

0

Вы пробовали решение упомянутые здесь:

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

Пожалуйста, обратите внимание, что выше только запускает обновление, сам виджет будет необходимо получить требуемые данные.

Помните, что в то время, когда радиовещательные приемники могут быть зарегистрированы в виджетах, после обновления они предназначены для сбора мусора и, как таковые, не являются надежным решением.

Конечной альтернативой является регистрация AlarmManager для запуска службы, выполняющей обновления виджетов.