0

メインのフラグメント内の各行にブックマークアイコン付きの着信音のリストビューがあります。 (メインのFragment内のブックマークアイコンをクリックすると、その特定の行データが共有設定に保存され、お気に入りのFragmentに追加されます)。共有設定からデータを取得した後にリストビューが更新されない

私の問題は、アイテムをクリックしてお気に入りにするときにお気に入りのフラグメントにすぐに表示されないことです。私はすべてこれを試しました:

listView.requestLayout(); 
listView.refreshDrawableState(); 
listView.invalidate(); 
listView.invalidateViews(); 
adapter.notifyDataSetChanged(); 

どれも動作しません。または、お気に入りのフラグメントをデタッチして添付するか、アプリケーションを閉じてからもう一度開く必要があります。

お願いします。

これは私がメインフラグメント内の私の共有好み

@Override 
public boolean favOnClick(int position , View v) { 
    ProductLight product = soundList.get(position); 
    ImageView button = (ImageView) v.findViewById(R.id.favImageHive); 
    String tag = button.getTag().toString(); 
    if (tag.equalsIgnoreCase("grey")) { 
     sharedPreference.addFavorite(product); 
     snackS("Added to Favorites"); 
     button.setTag("red"); 
     button.setImageResource(R.mipmap.bookmarked); 
    } else { 
     sharedPreference.removeFavorite(product); 
     button.setTag("grey"); 
     button.setImageResource(R.mipmap.bookmark_border); 
     snackS("Removed from Favorites"); 
    } 
    return true; 
} 

に項目を追加し、私はこのような好きな断片内の共有設定から私のお気に入りのリストを取得する方法である:

private List<ProductLight> soundList = new ArrayList<ProductLight>(); 
. 
. 
. 

soundList = sharedPreference.getFavorites(); 
adapter = new CustomLightAdapter(activity, soundList); 
listView.setAdapter(adapter); 

共有設定

public class SharedPreference_light { 

public static final String PREFS_NAME = "Light_Products"; 
public static final String FAVORITES = "Favorite_Tones_Light"; 

SharedPreferences settings; 
SharedPreferences.Editor editor; 
Gson gson = new Gson(); 

public SharedPreference_light(Context context) { 
    settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
    editor = settings.edit(); 
} 

// This four methods are used for maintaining favorites. 
public void saveFavorites(List<ProductLight> favorites) { 
    String jsonFavorites = gson.toJson(favorites); 
    editor.putString(FAVORITES, jsonFavorites); 
    editor.apply(); 
} 

public void addFavorite(ProductLight product) { 
    List <ProductLight> favorites = getFavorites(); 
    if (favorites == null) 
     favorites = new ArrayList<ProductLight>(); 
    favorites.add(product); 
    saveFavorites(favorites); 
    Log.w("addPrefLog", favorites.toString()); 
} 

public void removeFavorite(ProductLight product) { 
    ArrayList <ProductLight> favorites = getFavorites(); 
    if (favorites != null) { 
     favorites.remove(product); 
     saveFavorites(favorites); 
    } 
} 

public ArrayList <ProductLight> getFavorites() { 
    List<ProductLight> favorites; 
    if (settings.contains(FAVORITES)) { 
     String jsonFavorites = settings.getString(FAVORITES, null); 
     ProductLight[] favoriteItems = gson.fromJson(jsonFavorites, ProductLight[].class); 
     favorites = Arrays.asList(favoriteItems); 
     favorites = new ArrayList <ProductLight> (favorites); 
    } else 
     return null; 

    return (ArrayList <ProductLight>) favorites; 
    } 
} 
+0

お気に入りアイテムの呼び出しメソッドfavフラグメントのリストを更新するfavボタンonclickのリストフラグメント –

+0

editor.apply()は非同期関数です。 onSharedPreferenceChangedのインタフェースリスナーまたは代わりにeditor.commit()を使用します。 – faruk

+0

@FarukItsDOはい、しかし、あまりにも多くのアイテムを保存するとcommit()はリストビューのスクロールを遅くします。私は途中で試してみて、うまくいきません。 – DastakWall

答えて

1

共有設定にデータを保存するときは、リストを更新する必要があります。これは、共有設定変更リスナーを使用して行うことができます。 メインフラグメントにSharedPreferences.OnSharedPreferenceChangeListenerを実装し、onSharedPreferenceChanged()メソッドをオーバーライドします。共有プリファレンス変更リスナーをoncreate()メソッド に登録してください(sharedPreferences.registerOnSharedPreferenceChangeListener(this))。 そして、onDestroy()で登録抹消してください。

共有設定にデータを追加すると、onSharedPreferenceChanged()でコールバックが取得されます。したがって、この方法でロジックを追加してリストをリフレッシュしてください。

+0

私の共有設定はうまくいきます。なぜなら、お気に入りのフラグメントのアイテムがあり、そのリストビューに表示されているからです。メインのフラグメントで、そのアイテムのマークを解除すると、お気に入りのフラグメントのブックマークアイコンがチェックされなくなりますが、アイテム自体はまだそこにあります。 – DastakWall

0

あなたはリストビューアダプター

adapter = new CustomLightAdapter(activity, soundList) //soundList should be a global variable;

soundListが同様に更新する必要がある変更を行うにリストを割り当てています。 adapter.notifyDataSetChanged()を呼び出すと、その変更がListViewに反映されます

関連する問題