代码之家  ›  专栏  ›  技术社区  ›  Vince VD

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

  •  0
  • Vince VD  · 技术社区  · 6 年前

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

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

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

    所以我的recyclerview没有用过滤后的arraylist更新我的arraylist。

    主要的音乐学家 是另一个活动的全局arraylist,存储设备中的所有歌曲。

    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;
    

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

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

    编辑(工作但不确定是否正确)

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

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

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

      //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();
        }
    };
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   No Body    6 年前

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