簡體   English   中英

SearchView 不更新項目,只更新文本

[英]SearchView not updating items, only text

我正在使用 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 參數不能是 null。我不知道是什么原因造成的?

我還收到了 IndexOutOfBoundsException。

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

任何幫助將不勝感激。

<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 中,創建兩個 arraylists

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

        }
    };
}

讓我知道這是否適合你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM