2013-08-30 5 views
3

친구가 하나의 애플리케이션을 완성 했으므로 이제 친구가 목록보기 방식으로 작업 목록을 표시하는 데 사용할 수있는 애플리케이션 용 위젯 하나를 만들었습니다. 처음에는 그가 위젯을 드래그하여 홈 화면에 설치하면 목록보기 방식으로 작업을 표시 할뿐만 아니라 잘 작동합니다.Listivew 위젯이 자동으로 업데이트되지 않습니다.

문제는 그가 응용 프로그램을 변경 한 다음 다시 홈 화면으로 돌아 왔을 때 변경 사항이 반영되지 않았기 때문입니다. 그는 위젯

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.net.Uri; 
import android.util.Log; 
import android.widget.RemoteViews; 

public class WidgetTaskSchedular extends AppWidgetProvider { 
    private final String TAG = "CalendarViewSample:" 
      + this.getClass().getName(); 

    SharedPreferences sharedprefer; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
     if(intent.getAction().equals("update_widget")) 
     { 
      int[] appid=new int[1]; 
      sharedprefer=context.getSharedPreferences("TaskWidget", 0); 
      appid[0]=sharedprefer.getInt("widget_key",0); 
      Log.i(TAG,"Appwidgetid"+appid[0]); 
      onUpdate(context, AppWidgetManager.getInstance(context),appid); 

     } 
    } 
    public static String EXTRA_WORD= 
      "com.capsone.testing.calendar.WORD"; 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
     for (int i=0; i<appWidgetIds.length; i++) { 

      sharedprefer=context.getSharedPreferences("TaskWidget", 0); 
      SharedPreferences.Editor editor=sharedprefer.edit(); 
      editor.putInt("widget_key", appWidgetIds[i]); 
      editor.commit(); 
      int a= sharedprefer.getInt("widget_key", 0); 
      Log.i(TAG,"Sharedpreferencewidgetid:"+a); 

       //ID=appWidgetIds[i]; 
       Log.i(TAG,"LengthofWidget:"+appWidgetIds.length); 
      // Log.i(TAG,"TestAppWidget:"+ID); 
       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); 
      } 

    } 
} 

답변

6

난 당신이 코드가 아래에 붙여 시도하는 것이 좋습니다 :

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

notifyAppWidgetViewDataChanged()은 ---> 자신의 현재 데이터를 무효로 지정된 모든 AppWidget 경우에 지정된 컬렉션 뷰를 통지합니다.

그래서 당신은 다음 RemoteViewsFactoryonDataSetChanged() 방법이 ListView에 대한 어댑터 역할을하는 호출됩니다 notifyAppWidgetViewDataChanged()를 호출 할 때. 당신은 onDataSetChanged()에 웹 서비스/네트워크 관련 작업, 데이터베이스 및 다른 작업에서 데이터 가져 오기 작업을 수행하고 응답을 가져와 ArrayList 또는 그와 같은 Collection 일 가능성이있는 데이터 세트에 추가 할 수 있습니다.

0

를 업데이트하려면이 하나 onReceive() 방법을 사용하면이 솔루션은 여기에 언급 봤어 :

How to update a Widget dynamically (Not waiting 30 min for onUpdate to be called)?

은, 위의 단지 업데이트를 트리거하는 위젯 자체를주의한다 필요한 데이터를 가져와야합니다.

브로드 캐스트 리시버는 업데이트 후에 위젯에 등록 할 수 있지만 가비지 수집을위한 것이므로 신뢰할 수있는 솔루션이 아닙니다.

마지막 대안은 AlarmManager를 등록하여 위젯 업데이트를 수행하는 서비스를 시작하는 것입니다.

관련 문제