2013-08-21 2 views
0

Я завершил одно приложение задачи в android. И теперь я создаю один виджет для этого приложения. В моем виджете у меня есть список задач на сегодняшний день, который работает правильно. Моя проблема заключается в том, когда я перехожу к моему приложению и добавлю некоторые задачи сегодня, а затем вернусь к главному экрану, виджет имеет только старые данные вместо новых данных и никаких изменений ... пожалуйста, помогите мне ....Как автоматически обновлять виджет в главном экране

My RemoteFactory класс:

public class TaskItemStatus implements RemoteViewsService.RemoteViewsFactory { 
Context context; 
int appWidgetId; 
String statusRemainingTask="false"; 
String[] items; 
private final String TAG = "CalendarViewSample:" 
     + this.getClass().getName(); 

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

@SuppressLint("SimpleDateFormat") 
private void getData() { 
    List<String> listTask=new ArrayList<String>(); 
    Taskdatabase objTaskDb = new Taskdatabase(this.context); 
    objTaskDb.Open(); 
    Calendar calendarToday = Calendar.getInstance(); 
    SimpleDateFormat simpledateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    String dateToday = simpledateFormat.format(calendarToday.getTime()); 
    listTask.addAll(objTaskDb.fetchTodayRemainTask(dateToday, statusRemainingTask)); 
    Log.i(TAG,"ListTask:"+listTask.toString()); 
    items=new String[listTask.size()]; 
    items=listTask.toArray(items); 
} 

@Override 
public int getCount() { 
    return (items.length); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public RemoteViews getLoadingView() { 
    return null; 
} 
@Override 
public RemoteViews getViewAt(int position) { 
    RemoteViews row = new RemoteViews(context.getPackageName(), 
      R.layout.widgetrow); 
    row.setTextViewText(android.R.id.text1, items[position]); 
    Intent i = new Intent(); 
    //Bundle extras = new Bundle(); 
    //extras.putString(WidgetTaskSchedular.EXTRA_WORD, items[position]); 
    //i.putExtras(extras); 
    row.setOnClickFillInIntent(android.R.id.text1, i); 
    return (row); 
} 

@Override 
public int getViewTypeCount() { 
    return 1; 
} 

@Override 
public boolean hasStableIds() { 
    return (true); 
} 

@Override 
public void onCreate() { 

} 

@Override 
public void onDataSetChanged() { 

} 

@Override 
public void onDestroy() { 

} 

} 

WidgetProvider:

public class WidgetTaskSchedular extends AppWidgetProvider { 
static int ID; 
    static final int[] sameid=new int[1]; 
    public static String EXTRA_WORD= 
      "com.capsone.testing.calendar.WORD"; 
@Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
     if(intent.getAction().equals("update_widget")) 
     { 
     Log.i(TAG,"AppWidgetIds:"+ID); 


     for(int i=0;i<1;i++) 
     { 
      sameid[i]=ID; 
      Log.i(TAG,"SameId:"+sameid[i]); 
      onUpdate(context, AppWidgetManager.getInstance(context),sameid); 
     } 

     } 
    } 





    @SuppressWarnings("deprecation") 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
ID=appWidgetIds[i]; 

     for (int i=0; i<appWidgetIds.length; i++) { 
       Log.i("Widget","WidgetId:"+appWidgetIds.length); 
       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); 
      } 

    } 
    } 

ответ

2

AppWidgetProvider класс:

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

RemoteView класс:

@Override 
public void onDataSetChanged() { 
    // Just copy and paste you getdata() coding here 
} 
1

Один из способов достижения этой цели - при сохранении новой задачи в приложении просто отправьте широковещательную рассылку с пользовательским намерением указать изменение в базовой базе данных. Добавьте получателя в эту трансляцию в вашем классе WidgetTaskSchedular и в методе приема вызовите метод onUpdate для повторного заполнения данных в виджетах. Несколько как это:

public void onReceive(Context context, Intent intent) { 
    System.out.println("On receive function"); 
    if (intent.getAction().equals("com.android.myapp.myBroadcast")) { 
     System.out.println("There is an update from app "); 
     //re populate data or in onUpdate 
     onUpdate(context, AppWidgetManager.getInstance(context), IDs); 
    } 
    super.onReceive(context, intent); 
} 

PS: Сохранить Идентификаторы как статическое поле или something.I взял в идентификаторах в статическом массиве целых чисел, которые я populatedin метод OnUpdate, вы также можете попробовать заменить эту часть с помощью следующих код: RemoteViews remoteViews = new RemoteViews (context.getPackageName(), R.layout.widget);

 // Update - here like for example as below 
     remoteViews.setTextViewText(R.id.yourTextID, "My updated text"); 

     // Trigger widget layout update 
     AppWidgetManager.getInstance(context).updateAppWidget(
       new ComponentName(context, Widget.class), remoteViews); 
+0

как объявить идентификатор, потому что это тип массива; – Satheesh

+0

Я передаю один и тот же идентификатор, но никаких изменений в моем виджетах на главном экране ... – Satheesh

+0

Вы могли заставить его работать с этим обновленным кодом? – Dhruv

Смежные вопросы