0

音楽プレーヤーを構築しようとしています。 私はviewpagerを使っているので、PlaylistデータとPlaylistフラグメントのための別のクラスを提供するMusicDataというクラスがあります。 プレイリストフラグメントは、カスタムexpandableListAdapterクラスを使用してデータをロードします。データは変更されましたが、notifyDataSetChangedは機能しません。

これは問題です。ユーザーが曲をクリックすると、最近再生されたプレイリストに追加され、プレイリストの断片に反映されます。 プレイリストから最初の曲をクリックしても同じ再生が行われますが、曲のタイトルを含むビューは変更されないため、基になるデータは変更されます

したがって、基礎データを反映していません。 notifyDataSetChangedメソッドをプレイリストフラグメントクラスに配置しようとしましたが、動作しません。何をすべきか?

ここ

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.playlist, container, false); 
    expandableListView = (ExpandableListView)v.findViewById(R.id.expandableListViewPlaylist); 
    Log.e(TAG,"1"); 
    expandableListTitle = new ArrayList<>(MusicData.getExpandableListDetailPlayList().keySet()); 
    expandableListAdapter = new CustomExpandableListAdapter(this.getContext(), expandableListTitle, MusicData.getExpandableListDetailPlayList()); 
    expandableListView.setAdapter(expandableListAdapter); 
    expandableListAdapter.notifyDataSetChanged(); 
    ....... 

プレイリストフラグメントクラスのコードだと、これは音楽データのクラスのコード

public static LinkedHashMap<String, ArrayList<Song>> getExpandableListDetailPlayList(){return expandableListDetailPlayList;} 

であり、これはプレイリストのデータが変更されたアダプタ

public class CustomExpandableListAdapter extends BaseExpandableListAdapter { 

private Context context; 
private ArrayList<String> expandableListTitle; 
private LinkedHashMap<String, ArrayList<Song>> expandableListDetail; 
private String TAG = "AdapterClass"; 
public CustomExpandableListAdapter(Context context, ArrayList<String> expandableListTitle, 
            LinkedHashMap<String, ArrayList<Song>> expandableListDetail) { 
    this.context = context; 
    this.expandableListTitle = expandableListTitle; 
    this.expandableListDetail = expandableListDetail; 

} 

@Override 
public Object getChild(int listPosition, int expandedListPosition) { 
    return this.expandableListDetail.get(this.expandableListTitle.get(listPosition)) 
      .get(expandedListPosition); 
} 

@Override 
public long getChildId(int listPosition, int expandedListPosition) { 
    return expandedListPosition; 
} 
......  

ですMainActivityクラスにあります。どうすればnotifyDataSetChanged()メソッドを呼び出すことができますか?

+0

ユーザーのクリックを処理するコードの部分を共有し、それに応じてその曲をリストに追加してください –

+0

どこでnotifyDataSetChanged()メソッドを呼び出しますか?あなたのデータが変更された後に –

答えて

0

notifyDataSetChanged()は、データが変更されたことをアダプタに通知するために使用されます。アダプター/ビューのセットアップ/作成時に使用していますが、これは意味をなさないものです。あなたは何をすべきと何あなたはおそらく不足しているのはnotifyDataSetChanged()方法

EDIT呼び出し、その後、アダプタのデータに選択した曲を追加している:OP

から私は、リスナーを実装しようとしたがメッセージはメインアクティビティからフラグメントに送られなければならないので、それを動作させることができませんでした。それは私にはそれを行う方法がないようです。

とにかく、私はEventBusを試してみましたが、それでもnotifyDataSetChangedメソッドはうまくいかず、notifyDataSetInvalidatedもしませんでした。

最終的に、ビューをクリアして新しいデータを設定するアダプタクラスに別の関数を書き込む必要がありました。私はプレイリストの断片からこの関数を呼び出しました。ここでは、コードです

public void refresh(ArrayList<String> expandableListTitle, 
        LinkedHashMap<String, ArrayList<Song>> expandableListDetail){ 
    this.expandableListDetail.clear(); 
    this.expandableListTitle.clear(); 
    this.expandableListDetail.putAll(expandableListDetail); 
    this.expandableListTitle.addAll(expandableListTitle); 
    this.notifyDataSetChanged(); 
    } 

は再び私は、メソッドが削除され通知し、グループビューが展開されている場合のビューが更新されなかったことを見た場合に何が起こったかを確認するために少し実験を行いました。グループビューが折りたたまれ、再度展開されたときに更新されました。したがって、ここではnotifyメソッドが機能しましたが、ビューをクリアした後にのみです。 私はビューをクリアしなかったときにnotifyメソッドが機能しませんでした。

LESSON notifyメソッドを呼び出す前に、常にビューを消去し、新しいデータを注入してください。たぶん、他のAndroidアプリでは、ビューやすべてをクリアする必要はありませんが、誰もチャンスを取るべきではないと思います。私はAndroid API 19でテストしました。

+0

が表示される問題は、主なアクティビティでデータが変更されていることです。フラグメントクラスは、表示目的とアダプターの設定用です。 したがって、どのように通知メソッドを呼び出すのか分かりますか?限り、私はおそらくdataSetObserverを実装する必要があります理解することができますが、私はそれを行う方法がわからない –

+0

あなたは、アクティビティとフラグメント間の通信にイベントバスやインターフェイスを使用することができます。これらの方法はどちらも、断片にアクティビティから何かを行うように指示する方法を提供します https://developer.android.com/training/basics/fragments/communicating.html https://github.com/greenrobot/ EventBus –

+0

イベントバスを提案してくれてありがとう。それは@howdoidothisを助けた –

関連する問題