Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnUpdate()未调用小部件服务_Android_Listview_Android Widget_Android Syncadapter - Fatal编程技术网

Android OnUpdate()未调用小部件服务

Android OnUpdate()未调用小部件服务,android,listview,android-widget,android-syncadapter,Android,Listview,Android Widget,Android Syncadapter,我正在为我的应用程序开发一个小部件。Widget name是history,当用户浏览任何URL时,我会将其存储在本地数据库中,该数据库将列出其中的Widget 当我打开小部件时,它从本地数据库获取所有详细信息,并在小部件的列表视图中显示 1) 当我打开小部件时,调用WidgetProvider的第一个onUpdate方法 2) 然后onUpdate()将调用服务WidgetService 3) 然后服务将调用小部件工厂,使用本地存储的数据库更新列表视图 在widget factory中,它将获

我正在为我的应用程序开发一个小部件。Widget name是history,当用户浏览任何URL时,我会将其存储在本地数据库中,该数据库将列出其中的Widget

当我打开小部件时,它从本地数据库获取所有详细信息,并在小部件的列表视图中显示

1) 当我打开小部件时,调用WidgetProvider的第一个onUpdate方法

2) 然后onUpdate()将调用服务WidgetService

3) 然后服务将调用小部件工厂,使用本地存储的数据库更新列表视图

在widget factory中,它将获取db值并更新widget中的LisView

以上是设置小部件时发生的过程。

头等舱:

        public class WidgetProviderFavorite extends AppWidgetProvider {

        @SuppressWarnings("deprecation")
        @Override
          public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager,int[] appWidgetIds) {            
            for (int i=0; i<appWidgetIds.length; i++) {
              Intent svcIntent=new Intent(ctxt, WidgetServiceFavorite.class);
              svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
              svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));  
              RemoteViews widget=new RemoteViews(ctxt.getPackageName(),R.layout.widget_favorite);
              widget.setRemoteAdapter(appWidgetIds[i], R.id.listFavoriteLogin,svcIntent);                                  
              Intent clickIntent=new Intent(ctxt, WidgetActivityFavorite.class);                                 
              PendingIntent clickPI=PendingIntent.getActivity(ctxt, 0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);

              widget.setPendingIntentTemplate(R.id.listFavoriteLogin, clickPI);                                              
              appWidgetManager.updateAppWidget(appWidgetIds[i], widget);

            }

            super.onUpdate(ctxt, appWidgetManager, appWidgetIds);
          } 
        public class WidgetServiceFavorite extends RemoteViewsService {
          @Override
          public RemoteViewsFactory onGetViewFactory(Intent intent) {

            return(new WidgetFactoryFavorite(this.getApplicationContext(),intent));         
          }
        }
第三个类:将获取并更新listview

在construtor和getViewAt()中完成的抓取(自动调用)将设置值

        public class WidgetFactoryFavorite extends Activity implements RemoteViewsService.RemoteViewsFactory {

          public WidgetFactoryFavorite(Context ctxt, Intent intent) {
              int array_Index=0;
              int array_Length=0;
              WidgetDatabase db1=new WidgetDatabase(ctxt);
              List<WidgetDatabaseModel> facorite = db1.getFavorite();
              array_Length=facorite.size(); 

              mNames=new String[array_Length];                                     
              mSummary=new String[array_Length];

              for (WidgetDatabaseModel cn : facorite) {                     
                  mNames[array_Index] =cn.getNAME(); 
                  mSummary[array_Index]= cn.getSUMMARY();
                  array_Index++;
              } 

              this.mCtxt=ctxt;
              intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                                              AppWidgetManager.INVALID_APPWIDGET_ID);

          }
            @Override
          public void onCreate() {
            // no-op
          }

          @Override
          public void onDestroy() {
            // no-op
          }

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

          @Override
          public RemoteViews getViewAt(int position) {

              RemoteViews row=new RemoteViews(mCtxt.getPackageName(),
                                             R.layout.widget_rowfavorite);

              row.setTextViewText(android.R.id.text1, mNames[position]);

              Intent i=new Intent();
              Bundle extras=new Bundle(); 
              extras.putString(WidgetProviderFavorite.sExtra_Guid, mGuid[position]);
              extras.putString(WidgetProviderFavorite.sExtra_Url, mUrl[position]);
              i.putExtras(extras);
              row.setOnClickFillInIntent(android.R.id.text1, i);

              return(row);
          }

          @Override
          public RemoteViews getLoadingView() {
            return(null);
          }

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

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

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

          @Override
          public void onDataSetChanged() {
          }
        }
它正在调用onUpdate方法()。但是onUpdate不调用服务类,服务类将调用工厂类,并使用新的数据库值更新lisview。当新值添加到db中时,我前面提到的流没有发生

为什么不调用服务方法

或任何其他方法在数据库值更改时刷新列表视图

我们必须在onUpdate方法()中调用notifyAppWidgetViewDataChanged()

完成OnUpdate():

公共类WidgetProviderFavorite扩展了AppWidgetProvider{
@抑制警告(“弃用”)
@凌驾
public void onUpdate(上下文ctxt,AppWidgetManager,AppWidgetManager,int[]appWidgetIds){

对于(int i=0;我想任何人都可以给我一些建议。我从上周起就被卡住了…无法解决这个问题。在我这边,更新呼叫,但listview上的服务是服务部分没有呼叫,尽管我呼叫NotifyAppWidgetViewDataChanged,但你救了我一天!
        int[] ids = AppWidgetManager.getInstance(mActivity).getAppWidgetIds(new ComponentName(mActivity, WidgetProviderFavorite.class));
        WidgetProviderFavorite myWidget = new WidgetProviderFavorite();
        myWidget.onUpdate(mActivity, AppWidgetManager.getInstance(mActivity),ids);
   appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listView);
    public class WidgetProviderFavorite extends AppWidgetProvider {

    @SuppressWarnings("deprecation")
    @Override
      public void onUpdate(Context ctxt, AppWidgetManager appWidgetManager,int[] appWidgetIds) {            
        for (int i=0; i<appWidgetIds.length; i++) {
          Intent svcIntent=new Intent(ctxt, WidgetServiceFavorite.class);
          svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
          svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));  
          RemoteViews widget=new RemoteViews(ctxt.getPackageName(),R.layout.widget_favorite);
          widget.setRemoteAdapter(appWidgetIds[i], R.id.listFavoriteLogin,svcIntent);                                  
          Intent clickIntent=new Intent(ctxt, WidgetActivityFavorite.class);                                 
          PendingIntent clickPI=PendingIntent.getActivity(ctxt, 0,clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);

          widget.setPendingIntentTemplate(R.id.listFavoriteLogin, clickPI); 

          appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listView);                

          appWidgetManager.updateAppWidget(appWidgetIds[i], widget);

        }

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