Java 使用searchview筛选时,Recyclerview不更新数据

Java 使用searchview筛选时,Recyclerview不更新数据,java,android,filtering,searchview,Java,Android,Filtering,Searchview,因此,我在带有5个片段的选项卡式活动中有一个searchview,当我在片段1(Tab1)中搜索某些内容时,它会用搜索到的歌曲正确过滤我的recyclerview 但它仍然会播放列表中的歌曲和我的所有歌曲,而不是筛选列表中的歌曲 例如,在片段1中,我有5首歌,我搜索第5首歌,但当我尝试播放第5首歌时,它仍然播放我的第一首歌 因此,我的recyclerview没有使用过滤后的arraylist更新我的arraylist Main.musicList是另一个活动的全局数组列表,用于存储设备中的所有歌

因此,我在带有5个片段的选项卡式活动中有一个searchview,当我在片段1(Tab1)中搜索某些内容时,它会用搜索到的歌曲正确过滤我的recyclerview

但它仍然会播放列表中的歌曲和我的所有歌曲,而不是筛选列表中的歌曲

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

因此,我的recyclerview没有使用过滤后的arraylist更新我的arraylist

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

StorageUtil是一个帮助类,它将我的arraylist与歌曲和歌曲索引一起存储,以便我可以播放歌曲

我该怎么做

谢谢

活动

@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;
带有searchview过滤器的适配器

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

问题是如何获得音乐索引。 过滤音乐列表时,列表中只有一项。 所以它在列表中的位置总是0。
您应该在real music列表(Main.musicList)中获得所选项目的索引。

对,但我从用户单击的位置获取音乐索引,但如何在筛选列表时获取位置?您可以将项目的真实索引放入相关对象中。您可以检查我的编辑工作,但我不确定这是正确的方法。唯一需要注意的是,您可以使用诸如EventBus之类的库,而不是广播广播由操作系统处理,但像EventBus这样的库在应用程序上下文中工作。
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();
    }
}
   @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();
    }
};