2017-02-09 99 views
3

我正在爲我的應用程序開發小部件。窗口小部件名稱是歷史記錄,當用戶瀏覽任何URL時,我將它存儲在本地數據庫中,該窗口小部件列表來自它。OnUpdate()不調用小部件服務

當我打開窗口小部件時,它從本地數據庫獲取所有細節並在窗口小部件的列表視圖中顯示它。

1)當我打開小部件,WidgetProvider的第一的onUpdate方法稱爲

2)然後的onUpdate()將調用服務WidgetService

3)然後服務將調用Widget Factory使用本地存儲的數據庫更新列表視圖。

在小部件工廠中,它將獲取db值並更新小部件中的lisviews。

以上是設置小部件時發生的過程。

 public class WidgetServiceFavorite extends RemoteViewsService { 
      @Override 
      public RemoteViewsFactory onGetViewFactory(Intent intent) { 

      return(new WidgetFactoryFavorite(this.getApplicationContext(),intent));   
      } 
     } 

第三類:這是會獲取和更新列表視圖

第一類:

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

第二類。

在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() { 
      } 
     } 

我的問題是:

它不是並排當我瀏覽了一些網址在瀏覽器中通過同步側。當數據庫被新的URL更新時,我使用了下面的代碼同步。其調用onUpdate方法()。但onUpdate不會調用要調用工廠類的服務類,並用新的數據庫值調用lisview。我之前提到的流程在新值添加到db時沒有發生。

爲什麼不調用服務方法?

或任何其他方法刷新列表視圖時,數據庫值改變

+0

任何人都可以請給我一些建議。我從上週開始就陷入了困境......無法解決這個問題。 – Vji

回答

2

回答我的自我:

我們必須調用notifyAppWidgetViewDataChanged()在onUpdateMethod()。

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

完整的OnUpdate():

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); 
     } 
相關問題