0

我已经在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() {

}

}

小部件提供者:

 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);
            }

    }
    }
4

2 回答 2

3

AppWidgetProvider 类:

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

远程视图类:

@Override
public void onDataSetChanged() {
    // Just copy and paste you getdata() coding here
}
于 2013-09-05T09:39:36.713 回答
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:将 ID 保存为静态字段或其他内容。我在 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);
于 2013-08-21T20:08:42.623 回答