2017-11-18 13 views
0

私はたくさんのソリューションを試しましたが、数週間後にこの問題を解決できませんでした。なぜ "notifyappwidgetviewdatachanged"が機能しませんか?私のウィジェットに配置されたリストビューを更新するにはどうすればよいですか?どこが間違っていますか?notifyappwidgetviewdatachanged私のウィジェットのリストビューで作業していません

ここに私のクラスがあります。

ウィジェットプロバイダ:

public class Widget_Provider extends AppWidgetProvider 
{ 
public static final String ACTION_MOSTRAORARI = "fACTION_TOAST"; 
public static final String EXTRA_STRING = "EXTRA_STRING"; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    // There may be multiple widgets active, so update all of them 
    for (int appWidgetId : appWidgetIds) 
    { 
     RemoteViews views = updateWidgetListView(context, appWidgetId); 

     final Intent onItemClick = new Intent(context, Widget_Provider.class); 
     onItemClick.setAction(ACTION_MOSTRAORARI); 
     onItemClick.setData(Uri.parse(onItemClick.toUri(Intent.URI_INTENT_SCHEME))); 
     final PendingIntent onClickPendingIntent = PendingIntent.getBroadcast(context, 0, onItemClick, PendingIntent.FLAG_UPDATE_CURRENT); 
     views.setPendingIntentTemplate(R.id.myStopList, onClickPendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

public RemoteViews updateWidgetListView(Context context, int appWidgetId) 
{ 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget); 
    Intent svcIntent = new Intent(context, Widget_Service.class); 
    svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
    remoteViews.setRemoteAdapter(R.id.myStopList, svcIntent); 
    return remoteViews; 
} 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    if (intent.getAction().equals(ACTION_MOSTRAORARI)) { 

     if (MainUtils.isNewtworkAvailable(context)) 
     { 
      String item = intent.getExtras().getString(EXTRA_STRING); 
      Intent intentOrari = new Intent(context, Diag_MostraOrari.class); 
      intentOrari.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
      context.startActivity(intentOrari); 
     } 
    } 

    super.onReceive(context, intent); 
} 

@Override 
public void onDeleted(Context context, int[] appWidgetIds) {} 

@Override 
public void onEnabled(Context context) {} 

@Override 
public void onDisabled(Context context) {} 
} 

ウィジェットサービス:

public class Widget_Service extends RemoteViewsService 
{ 

@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) 
{ 
    Map<String, ArrayList<String>> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); 

    /* --- 
    * Here i fetch data from a local db and store it on "map" 
    */ --- 

    return (new Widget_ListProvider(this.getApplicationContext(), intent, map)); 
} 

} 

ListProvider:

public class Widget_ListProvider implements RemoteViewsFactory 
{ 
private Map<String, ArrayList<String>> map = new HashMap<>(); 
private ArrayList<ListItem_Widget> listItemList = new ArrayList<>(); 
private Context context = null; 
private int appWidgetId; 

public Widget_ListProvider(Context context, Intent intent, Map<String, ArrayList<String>> map) 
{ 
    this.map = map; 
    this.context = context; 
    appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 

    populateListItem(); 
} 

//This function populate the arraylist "listItemList" by the data stored on "map" 
private void populateListItem() { [...] } 

@Override 
public int getCount() { 
    return listItemList.size(); 
} 

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

@Override 
public RemoteViews getViewAt(int position) 
{ 
    final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.listitem_widget); 
    ListItem_Widget listItem = listItemList.get(position); 
    remoteView.setTextViewText(R.id.heading, listItem.heading); 
    remoteView.setTextViewText(R.id.content, listItem.content); 

    final Intent fillInIntent = new Intent(); 
    fillInIntent.setAction(Widget.ACTION_MOSTRAORARI); 
    final Bundle bundle = new Bundle(); 
    bundle.putString(Widget.EXTRA_STRING, listItem.heading); 
    fillInIntent.putExtras(bundle); 
    remoteView.setOnClickFillInIntent(R.id.listrow, fillInIntent); 

    return remoteView; 
} 


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

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

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

@Override 
public void onCreate() {} 

@Override 
public void onDataSetChanged() {} 

@Override 
public void onDestroy() {} 

} 

私のリストビューのカスタム項目のXMLは、ちょうど2つのtextviewsが含まれています:「 "見出し" とコンテンツ"。

どこが間違っていますか?なぜ私は "notifyappwidgetviewdatachanged"を別のアクティビティから呼び出すと何も起こりませんか?私は私のウィジェットを更新する必要がある活動だ

[EDIT]

public class Diag_Line extends AppCompatActivity 
{ 
    //[...] 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     //[...] 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
     ComponentName thisAppWidget = new ComponentName(getApplicationContext().getPackageName(), Widget.class.getName()); 
     int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); 
     appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.myStopList); 

     //"myStopList" is the id of my listview inside the widget xml. 

     //[...] 
    } 
} 
+0

ここで、あなたのリストビューを更新しようとしています(アクティビティを更新する場合は、コードを記入してください)。 –

答えて

2

問題は非常に明白です。あなたのRemoteViewsFactoryには、onDataSetChanged()という空のメソッドがあります。しかし、notifyAppWidgetViewDataChanged()を起動すると、onDataSetChanged()でコールバックを取得しています。より良い理解のためにこの写真をチェックしてください。 enter image description here

Diag_Lineは、構成アクティビティーである場合は、単にこのような何かを作る:

appWidgetManager.updateAppWidget(appWidgetIds, views); // views is a RemoteViews that you need to build 
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.myStopList); 

はまた、UPDATE あなたのためにいくつかのヒントをhere

公式ドキュメントを確認してください。ウィジェットを使って作業している場合は、バックグラウンドですべてのデータと塗りつぶしを作成してください(IntentServiceは素晴らしいアプローチです)。だからIntentServiceを作ってここでウィジェットのロジックを作ってください。あなたがブロードキャストであなたのアップデートを引き起こしているなら、彼をフォアグラウンド(Android Oの場合のみ)にすることを忘れないでください。また、あなたに合ったlibraryをチェックすることもできます。

+0

そして、私はonDataSetChangedメソッドの中に何を書き込む必要がありますか? – FringeDc

+0

私はそれをしました!私はRemoteViewsFactoryでデータを完全に取得し、 "onDataSetChanged"で再度フェッチすることで問題を解決しました。 ありがとうございます! 私はこの問題の解決策を探していました。もう一度、ありがとう! – FringeDc

+0

問題を解決してくれてうれしいです) –

関連する問題