0

我正在使用 SearchView 过滤音乐项目。但是当我搜索一个项目时,歌曲的标题会更新,而不是实际的歌曲。最初我有listSongs = musicFiles工作但没有更新项目只有标题。然后我将其更改为listSongs = mFiles,这会引发 nullPointerException。

音乐适配器

public class MusicAdapter extends RecyclerView.Adapter<MusicAdapter.MyVieHolder> {

private Context mContext;
static ArrayList<MusicFiles> mFiles = new ArrayList<>();

MusicAdapter(Context mContext, ArrayList<MusicFiles> mFiles){
    MusicAdapter.mFiles = mFiles;
    this.mContext = mContext;
}

@NonNull
@Override
public MyVieHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.music_items, parent, false);
    return new MyVieHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyVieHolder holder, final int position) {
    holder.file_name.setText(mFiles.get(position).getTitle());
    byte[] image = getAlbumArt(mFiles.get(position).getPath());
    if (image != null){
        Glide.with(mContext).asBitmap()
                .load(image)
                .into(holder.album_art);
    }
    else{
        Glide.with(mContext).asBitmap()
                .load(R.drawable.something_3)
                .into(holder.album_art);
    }
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, MainActivity.class);
            intent.putExtra("position" , position);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(intent);
            notifyDataSetChanged();

        }
    });
}

@Override
public int getItemCount() {

    return mFiles.size();
}

public class MyVieHolder extends RecyclerView.ViewHolder{
    TextView file_name;
    ImageView album_art;

    public MyVieHolder(@NonNull View itemView) {
        super(itemView);
        file_name = itemView.findViewById(R.id.music_file_name);
        album_art = itemView.findViewById(R.id.music_img);
    }
}

private byte[] getAlbumArt(String uri){
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(uri);
    byte[] art = retriever.getEmbeddedPicture();
    retriever.release();
    return art;
}
public void updateList(ArrayList<MusicFiles> musicFilesArrayList){
    mFiles = new ArrayList<>();
    mFiles.addAll(musicFilesArrayList);
    notifyDataSetChanged();


}

主要活动

这是我遇到问题的代码

public void getInentMethod() {
    position = getIntent().getIntExtra("position", 0);
    listSongs = mFiles;                                       //bug occurs when listSongs = mFiles
    if (listSongs != null) {
        playBtn.setBackgroundResource(R.drawable.ic_pause);
        uri = Uri.parse(listSongs.get(position).getPath());
    }
    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
        mediaPlayer.start();
    }
    else {
        mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
        playBtn.setBackgroundResource(R.drawable.ic_play);
        mediaPlayer.stop();

    }
    seekBar.setMax(mediaPlayer.getDuration()/1000);
    metaData(uri);
}


    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search, menu);
    MenuItem menuItem = menu.findItem(R.id.search_option);
    SearchView searchView = (SearchView) menuItem.getActionView();
    searchView.setOnQueryTextListener(this);
    return super.onCreateOptionsMenu(menu);
}


    @Override
    public boolean onQueryTextSubmit (String query){
        return false;
    }

    @Override
    public boolean onQueryTextChange (String newText){
        String userInput = newText.toLowerCase();
        ArrayList<MusicFiles> musicFilesArrayList = new ArrayList<>();
        for (MusicFiles mFiles : musicFiles){
            if(mFiles.getTitle().toLowerCase().contains(userInput)){
                musicFilesArrayList.add(mFiles);
            }
        }
        musicAdapter.updateList(musicFilesArrayList);
        return true;
    }

当 listSongs = mFiles 我收到 nullPointerException 时,uri 参数不能为空。我不知道这是什么原因造成的?

我也收到了 IndexOutOfBoundsException。

引起:java.lang.IndexOutOfBoundsException:索引:0,大小:0。

任何帮助将不胜感激。

4

1 回答 1

1
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/search_bar"
        android:title="search"
        android:icon="@drawable/ic_baseline_search_24"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.widget.SearchView" />
 

</menu>

在 onCreateOptionsMenu 里面

        getMenuInflater().inflate(R.menu.main_menu,menu);
        MenuItem searchItem=menu.findItem(R.id.search_bar);
        MenuItem settingsItem=menu.findItem(R.id.action_settings);
        SearchView searchView= (SearchView) searchItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //do filter here
                adapter.getFilter().filter(newText);
                return false;
            }
        });

    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId()==R.id.search_bar) return true;
    return super.onOptionsItemSelected(item);

}

在 Adapter 类中,创建两个数组列表

class Adapter implements Filterable{
    private List<TotalItems> totalItems;              //original
    private List<TotalItems> totalItemsAll;           //copy
    Context context;
public Adapter(ArrayList<TotalItems> totalItems,Context context){
        this.totalItems=totalItems;
        this.context=context;
        this.totalItemsAll=new ArrayList<>(totalItems);
    }


 @Override
    public Filter getFilter() {
        return filter;
    }
    private Filter filter=new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            //TotalItems is my model class
            List<TotalItems> filteredList=new ArrayList<>();
            if (charSequence==null||charSequence.length()==0)
                filteredList.addAll(totalItemsAll);
            else {
                String filterPattern=charSequence.toString().toLowerCase().trim();

                for (TotalItems productList:totalItemsAll){
                    if (productList.getiName().toLowerCase().contains(filterPattern)){
                        filteredList.add(productList);
                    }else Toast.makeText(context,"No results found",Toast.LENGTH_LONG).show();
                }
            }
            FilterResults filterResults=new FilterResults();
            filterResults.values=filteredList;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            totalItems.clear();
            totalItems.addAll((List)filterResults.values);
            notifyDataSetChanged();

        }
    };
}

让我知道这是否适合您

于 2020-11-11T21:26:19.273 回答