【问题标题】:Implement SearchView in Action Bar in Android在 Android 的 Action Bar 中实现 SearchView
【发布时间】:2014-08-20 11:18:22
【问题描述】:

我已经在操作栏中实现了搜索,但我总是得到 0 个结果,即使文本可用。不知道哪里出错了?

这是我尝试过的一段代码:

    ArrayList<States> stateList = new ArrayList<States>();

    States _states = new States("AP","Andhra Pradesh",false);
    stateList.add(_states);
    _states = new States("DL","Delhi",true);
    stateList.add(_states);
    _states = new States("GA","Goa",false);
    stateList.add(_states);
    _states = new States("JK","Jammu & Kashmir",true);
    stateList.add(_states);
    _states = new States("KA","Karnataka",true);
    stateList.add(_states);
    _states = new States("KL","Kerala",false);
    stateList.add(_states);
    _states = new States("RJ","Rajasthan",false);
    stateList.add(_states);
    _states = new States("WB","West Bengal",false);
    stateList.add(_states);
    _states = new States("AP","Andhra Pradesh",false);
    stateList.add(_states);
    _states = new States("DL","Delhi",true);
    stateList.add(_states);
    _states = new States("GA","Goa",false);

    //create an ArrayAdaptar from the String Array
    dataAdapter = new MyCustomAdapter(this,R.layout.state_info, stateList);
    listView = (ListView) findViewById(R.id.listView1);
    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);
    listView.setTextFilterEnabled(true);

我在操作栏中的搜索选项:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();

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

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onQueryTextSubmit(String query) 
{
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean onQueryTextChange(String newText) 
{
    // this is your adapter that will be filtered
    if (TextUtils.isEmpty(newText))
    {
        listView.clearTextFilter();
    }
    else
    {
        listView.setFilterText(newText.toString());
    }

    return true;
}

我的自定义适配器:

private class MyCustomAdapter extends ArrayAdapter<States>
{

    private ArrayList<States> stateList;

    public MyCustomAdapter(Context context, int textViewResourceId, 

            ArrayList<States> stateList) 
    {
        super(context, textViewResourceId, stateList);
        this.stateList = new ArrayList<States>();
        this.stateList.addAll(stateList);
    }

    private class ViewHolder
    {
        TextView code;
        CheckBox name;
    }

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

        ViewHolder holder = null;

        Log.v("ConvertView", String.valueOf(position));

        if (convertView == null)
        {

            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = vi.inflate(R.layout.state_info, null);

            holder = new ViewHolder();
            holder.code = (TextView) convertView.findViewById(R.id.code);
            holder.name = (CheckBox) convertView.findViewById(R.id.checkBox1);

            convertView.setTag(holder);

            holder.name.setOnClickListener( new View.OnClickListener() 
            {
                public void onClick(View v)  
                {
                    CheckBox cb = (CheckBox) v;
                    States _state = (States) cb.getTag();

                    Toast.makeText(getApplicationContext(), "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(), 
                            Toast.LENGTH_LONG).show();

                    _state.setSelected(cb.isChecked());
                }
            });

        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }

        States state = stateList.get(position);

        holder.code.setText(" (" + state.getCode() + ")");
        holder.name.setText(state.getName());
        holder.name.setChecked(state.isSelected());

        holder.name.setTag(state);

        return convertView;
    }

}

【问题讨论】:

    标签: android searchview android-searchmanager


    【解决方案1】:

    您可以在自定义适配器中实现过滤器。试试这个:Android Action Bar Search: How to filter a list by the property of a list item?

    希望对你有帮助!!

    【讨论】:

    • @Alejandra:感谢您的快速回复。我已经看到了这一点,但无法理解最后几行: for (Object obj : listaTotal) - 这里的 listaTotal 是什么? { if (条件) { listResult.add(obj); } }
    • @TheDevMan listaTotal 是您可以比较所有对象的地方。例如,listaTotal 拥有所有用户,在条件下您可以比较 user.getNombre().equals(string),如果条件为真,则将用户添加到过滤器列表。我不知道我是否解释过。对不起我的英语不好
    • @Alejandra:抱歉,我仍然在 listofTotal 中获得 NPE?这是我的行代码:txs.io/wfqb 我在代码中遗漏了什么吗?,什么是 listaTotal?一个 obj 数组?
    • @TheDevMan listaTotal 将是 stateList。是否要过滤 stateList 的元素?
    • 非常感谢我的工作。我不得不改变一些东西以满足我的需要。
    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多