0

Я пытаюсь создать музыкальный плеер. У меня есть класс под названием MusicData, который предоставляет данные плейлиста и другой класс для фрагмента списка воспроизведения, так как я использую viewpager. Фрагмент списка воспроизведения загружает данные с помощью настраиваемого класса 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(); 
    ....... 

И это код класса MusicData

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 метод не работал, также не уведомлялDataSetInvalidated.

В конечном итоге мне пришлось написать еще одну функцию в классе адаптера, которая очистила представления и установила свежие данные. Я вызвал эту функцию из фрагмента списка воспроизведения. Вот код

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

Снова я экспериментировала немного, чтобы посмотреть, что случилось, если уведомит метод удаляется, и увидел, что точка зрения не обновляется, если представление группы расширяется. Он обновился, когда групповое представление было свернуто и расширено снова. Таким образом, здесь метод уведомления работает, но только после очистки просмотров. Когда я не очистил точки зрения, метод уведомления не работал.

УРОК Всегда очищайте представления и вводите свежие данные перед вызовом метода уведомления. Возможно, на какой-то другой Android-авизе вам не нужно очищать представления и все, но я не думаю, что кто-то должен рискнуть. Я тестировал на Android api 19.

+0

см. проблема в том, что данные изменяются в основном действии. класс фрагмента предназначен только для целей просмотра и настройки адаптера. поэтому как узнать, когда позвонить методу уведомления? Насколько я понимаю, я должен, вероятно, реализовать dataSetObserver, но я не знаю, как это сделать. –

+0

Вы можете использовать eventbus или интерфейс для связи между активностью и фрагментом. Оба эти метода предоставят вам способ сообщить фрагменту что-то сделать из действия https://developer.android.com/training/basics/fragments/communicating.html https://github.com/greenrobot/ EventBus –

+0

спасибо за предложение eventbus. что помогло @howdoidothis –