回收器视图在使用搜索视图筛选时不更新数据



所以我在我的选项卡式活动中有一个包含 5 个片段的搜索视图,当我在片段 1 (Tab1( 中搜索某些内容时,它会使用搜索的歌曲正确过滤我的回收器视图。

但它仍然播放列表中的歌曲和我所有的歌曲,而不是过滤列表中的歌曲。

例如,在片段 1 中,我有 5 首歌曲,我搜索第 5 首歌曲,但当我尝试播放第 5 首歌曲时,它仍然播放我的第一首歌曲。

所以我的回收器视图没有使用过滤的数组列表更新我的数组列表。

Main.musicList是来自另一个活动的全局数组列表,它存储设备中的所有歌曲。

StorageUtil是一个辅助类,它存储我的数组列表以及歌曲和歌曲索引,以便我可以播放歌曲。

我该怎么做?

谢谢

活动

@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
PagerAdapter pagerAdapter = mViewPager.getAdapter();
for(int i = 0; i < pagerAdapter.getCount(); i++) {
Fragment viewPagerFragment = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, i);
if(viewPagerFragment != null && viewPagerFragment.isAdded()) {
if (viewPagerFragment instanceof Tab1){
Tab1 tab1 = (Tab1) viewPagerFragment;
if (tab1 != null){
tab1.beginSearch(newText); // Calling the method beginSearch of Tab1
if (newText == null || newText.trim().isEmpty()) {
tab1.resetSearch();
}
}
}else if (viewPagerFragment instanceof Tab2){
Tab2 tab2 = (Tab2) viewPagerFragment;
if (tab2 != null){
//tab2.beginSearch(query); // Calling the method beginSearch of Tab2
}
}else if (viewPagerFragment instanceof Tab3){
Tab3 tab3 = (Tab3) viewPagerFragment;
if (tab3 != null){
//tab3.beginSearch(query); // Calling the method beginSearch of Tab3
}
}else if (viewPagerFragment instanceof Tab4){
Tab4 tab4 = (Tab4) viewPagerFragment;
if (tab4 != null){
//tab4.beginSearch(query); // Calling the method beginSearch of Tab4
}
}else if (viewPagerFragment instanceof Tab5){
Tab5 tab5 = (Tab5) viewPagerFragment;
if (tab5 != null){
//tab5.beginSearch(query); // Calling the method beginSearch of Tab5
}
}
}
}        
return false;

片段(选项卡 1(

private void initRecyclerView() {
Main.musicList = Main.songs.songs;
// Connects the song list to an adapter
// (thing that creates several Layouts from the song list)
if ((Main.musicList != null) && (!Main.musicList.isEmpty())) {
allSongsAdapter = new AllSongsAdapter(getContext(), Main.musicList);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerViewSongs.setLayoutManager(linearLayoutManager);
recyclerViewSongs.setHasFixedSize(true);
recyclerViewSongs.setAdapter(allSongsAdapter);
Log.i(TAG, "Songs found in list!");
recyclerViewSongs.addOnItemTouchListener(new OnItemClickListeners(getContext(), new OnItemClickListeners.OnItemClickListener() {
@TargetApi(Build.VERSION_CODES.O)
@Override
public void onItemClick(View view, int position) {
Toast.makeText(getContext(), "You Clicked position: " + position, Toast.LENGTH_SHORT).show();
//Start playing the selected song.
playAudio(position);
}
}));
} else {
Log.i(TAG, "No songs found in list!");
}
}
public void beginSearch(String query) {
Log.e("QueryFragment", query);
allSongsAdapter.getFilter().filter(query);
}
public void resetSearch(){
allSongsAdapter = new AllSongsAdapter(getContext(), Main.musicList);
recyclerViewSongs.setAdapter(allSongsAdapter);
}
private void playAudio(int songIndex) {
//MediaService is active
//Store songList and songIndex in mSharedPreferences
StorageUtil storageUtil = new StorageUtil(getContext());
storageUtil.storeSong(Main.musicList);
storageUtil.storeSongIndex(songIndex);
//Send media with BroadcastReceiver
Intent broadCastReceiverIntent = new Intent(Constants.ACTIONS.BROADCAST_PlAY_NEW_SONG);
if (getActivity() != null) {
getActivity().sendBroadcast(broadCastReceiverIntent);
}
//Send media with BroadcastReceiver
Intent broadCastReceiverIntentUpdateSong = new Intent(Constants.ACTIONS.BROADCAST_UPDATE_SONG);
if (getActivity() != null) {
getActivity().sendBroadcast(broadCastReceiverIntentUpdateSong);
}
}

带搜索视图筛选器的适配器

public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}
private class ValueFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String str = constraint.toString().toUpperCase();
Log.e("constraint", str);
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<Song> filterList = new ArrayList<>();
for (int i = 0; i < filteredMusicList.size(); i++) {
if ((filteredMusicList.get(i).getTitle().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Song song = filteredMusicList.get(i);
filterList.add(song);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = filteredMusicList.size();
results.values = filteredMusicList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
musicList = (ArrayList<Song>) results.values;
notifyDataSetChanged();
}
}

编辑(工作,但不确定它是否是正确的方法(

在我的适配器中,我调用我的辅助类 StorageUtil 来存储我的音乐列表,我存储过滤的音乐列表,然后我制作了一个广播接收器,它发送我的音乐列表已更新的广播。

@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
musicList = (ArrayList<Song>) results.values;
notifyDataSetChanged();
StorageUtil storageUtil = new StorageUtil(context);
storageUtil.storeSong(musicList);
Intent broadCastReceiverIntent = new Intent(Constants.ACTIONS.BROADCAST_UPDATE_MUSICLIST);
context.sendBroadcast(broadCastReceiverIntent);
}

在我的片段中,我将音乐列表设置为过滤列表

//Register BroadCastReceiver UPDATE_SONG
private void registerUpdateMusicListBroadCastReceiver(){
IntentFilter intentFilter = new IntentFilter(Constants.ACTIONS.BROADCAST_UPDATE_MUSICLIST);
if (getActivity() != null) {
getActivity().registerReceiver(UpdateMusicListBroadCastReceiver, intentFilter);
}
}
private BroadcastReceiver UpdateMusicListBroadCastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
StorageUtil storageUtil = new StorageUtil(getContext());
Main.musicList = storageUtil.getSongs();
}
};

问题是如何获得音乐索引。 过滤音乐列表时,列表中只有一个项目。 所以它在列表中的位置始终为 0。 您应该在真实音乐列表(Main.musicList(中获取所选项目的索引。

最新更新