Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义listview中的Android Searchview不起作用_Java_Android_Listview_Searchview - Fatal编程技术网

Java 自定义listview中的Android Searchview不起作用

Java 自定义listview中的Android Searchview不起作用,java,android,listview,searchview,Java,Android,Listview,Searchview,我正在我的一个活动中的操作栏中实现searchview。在该活动中,它列出了我手机上的所有歌曲,我正在使用自定义列表视图。除了在操作栏中显示的Searchview之外,一切都正常,但它不起作用,就像当我试图输入它时,什么都没有发生。我试图搜索关于实现searchview的所有信息,并试图自己解决这个问题,但没有任何效果 这就是我到目前为止所做的 searchmenu.xml <menu xmlns:android="http://schemas.android.com/apk/res/an

我正在我的一个活动中的操作栏中实现searchview。在该活动中,它列出了我手机上的所有歌曲,我正在使用自定义列表视图。除了在操作栏中显示的Searchview之外,一切都正常,但它不起作用,就像当我试图输入它时,什么都没有发生。我试图搜索关于实现searchview的所有信息,并试图自己解决这个问题,但没有任何效果

这就是我到目前为止所做的

searchmenu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/Search"
    android:icon="@drawable/cast_ic_mini_controller_play"
    app:showAsAction="always"
    app:actionViewClass="android.support.v7.widget.SearchView" />

需要你们的帮助。提前谢谢你

将BaseAdapter换成ArrayAdapter,并将歌曲传递到超级类构造函数中。然后删除_songs变量,改为通过超类getItem()方法访问它们。完成此操作后,请更改publishResults()方法以直接修改超类数据,例如:

protected void publishResults(CharSequence constraint, FilterResults results) {
    clear();
    addAll((List<SongInfo>)results.values);
    notifyDataSetInvalidated();
}
受保护的void publishResults(CharSequence约束、FilterResults结果){
清除();
addAll((列表)results.values);
notifyDataSetionValidated();
}

你是说你不能输入文本,还是说你可以输入文本但不能提交查询?我可以输入文本但什么都没有发生这是我的问题:(它似乎不起作用。我想要的是,例如,当我输入字母“A”在searchview中,listview将被更新,它将列出所有以字母“A”开头的音乐。请帮助我。
<activity
        android:name=".Music"
        android:label="@string/title_activity_music"
        android:parentActivityName=".backup_menu"
        android:theme="@style/AppTheme.NoActionBar">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.chill.leoj.burp.backup_menu" />
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"
            />
    </activity>
    class SongAdapter extends BaseAdapter implements Filterable {
    private ArrayList<SongInfo> _songs = new ArrayList<SongInfo>();
    private ArrayList<SongInfo> songsfilt = new ArrayList<SongInfo>();
    private ItemFilter itemFilter;
    private Context context;
    LayoutInflater inflater;
    int checkAccumulator;

    public SongAdapter(Context _context, ArrayList<SongInfo> songs) {
        this.context = _context;
        this._songs = songs;
        this.songsfilt = songs;
        checkAccumulator = 0;

        getFilter();

    }

    public int getCount() {
        return _songs.size();
    }

    public Object getItem(int position) {
        return _songs.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public Filter getFilter() {
        if (itemFilter == null) {
            itemFilter = new ItemFilter();
        }

        return itemFilter;

    }

    private class ViewHolder {

        protected CheckBox checkBox;
        private TextView tvSongName;
        private TextView tvSongArtist;


    }

    public View getView(final int position, View convertView, ViewGroup parent) {



        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_songs, parent, false);

            viewHolder = new ViewHolder();

            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
            viewHolder.tvSongName = (TextView) convertView.findViewById(R.id.tvSongName);
            viewHolder.tvSongArtist = (TextView) convertView.findViewById(R.id.tvArtistName);
            viewHolder.checkBox.setOnCheckedChangeListener(null);


            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }


        viewHolder.tvSongName.setText(_songs.get(position).getSongname());
        viewHolder.tvSongArtist.setText(_songs.get(position).getArtistname());

        viewHolder.checkBox.setOnCheckedChangeListener(null);
        viewHolder.checkBox.setChecked(_songs.get(position).isSelected());

        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                count = (isChecked) ? count+1 : count - 1;


                if (!_songs.get(getPosition).isSelected()) {

                    _songs.get(getPosition).setSelected(true);
                    _songs.get(getPosition).setSelected(count > 0);
                    getChoice.setEnabled(true);
                    Log.e("URL", _songs.get(position).getSongUrl() + " ");

                } else {
                    _songs.get(getPosition).setSelected(false);
                    _songs.get(getPosition).setSelected(count < 1);
                    getChoice.setEnabled(false);

                }


            }


        });
        convertView.setTag(R.id.tvSongName, viewHolder.tvSongName);
        convertView.setTag(R.id.tvArtistName, viewHolder.tvSongArtist);
        convertView.setTag(R.id.checkBox, viewHolder.checkBox);

        viewHolder.checkBox.setTag(position); // This line is important.

        return convertView;
    }

    private class ItemFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            if (constraint!=null && constraint.length()>0) {
                ArrayList<SongInfo> tempList = new ArrayList<SongInfo>();

                // search content in friend list
                for (SongInfo user : songsfilt) {
                    if (user.getSongname().toLowerCase().contains(constraint.toString().toLowerCase())) {
                        tempList.add(user);
                    }
                }

                filterResults.count = tempList.size();
                filterResults.values = tempList;
            } else {
                filterResults.count = songsfilt.size();
                filterResults.values = songsfilt;
            }

            return filterResults;
        }

        /**
         * Notify about filtered list to ui
         * @param constraint text
         * @param results filtered result
         */
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            _songs = (ArrayList<SongInfo>) results.values;
            notifyDataSetChanged();
        }
    }
    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchMenuItem = menu.findItem(R.id.search);
    searchView = (SearchView) searchMenuItem.getActionView();

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setSubmitButtonEnabled(true);
    searchView.setOnQueryTextListener(this);

    return true;
}


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

@Override
public boolean onQueryTextChange(String newText) {
    songAdapter.getFilter().filter(newText);
    // use to enable search view popup text
    if (TextUtils.isEmpty(newText)) {
        listView.clearTextFilter();
    }
    else {
        listView.setFilterText(newText.toString());
    }
    return true;
}
protected void publishResults(CharSequence constraint, FilterResults results) {
    clear();
    addAll((List<SongInfo>)results.values);
    notifyDataSetInvalidated();
}