如何在主屏幕中自动更新小部件

时间:2013-08-21 11:32:41

标签: android widget updates

我在android中完成了一个任务应用程序。现在我为这个应用程序创建了一个小部件。在我的小部件中,我有今天的任务显示列表,这是正常工作。我的问题是当我去我的应用程序并添加今天的一些任务,然后回到主屏幕,窗口小部件只有旧数据而不是新数据,没有修改......请任何人帮助我....

我的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 个答案:

答案 0 :(得分: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 :(得分: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:将Ids保存为静态字段或其他东西。我在onUpdate方法中填充了一个静态整数数组中的ID,您也可以尝试使用以下代码替换该部分:  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);