【问题标题】:Adding the ability to search a listview添加搜索列表视图的功能
【发布时间】:2014-06-10 00:08:36
【问题描述】:

我有一个很长的列表视图,所以我尝试添加一个搜索栏,这样我就不必滚动列表视图来查找我想要的内容。它似乎过滤掉了它想要过滤掉的任何一个,关于我做错了什么的任何线索?

这是列表:

public class ExList {

private List<Example> listExample = new ArrayList<Example>();

public void populateThingsList(){
        listExample.add(new Example("asdf name", 1, "Example detail 1", "Example detail 2", R.drawable.1_icon, "Example detail 3"));
        listExample.add(new Example("ghkj name", 2, "Example detail 1", "Example detail 2", R.drawable.2_icon, "Example detail 3"));
        listExample.add(new Example("astg name", 3, "Example detail 1", "Example detail 2", R.drawable.3_icon, "Example detail 3"));
        listExample.add(new Example("ghky name", 4, "Example detail 1", "Example detail 2", R.drawable.4_icon, "Example detail 3"));
        listExample.add(new Example("ghee name", 5, "Example detail 1", "Example detail 2", R.drawable.5_icon, "Example detail 3"));
        listExample.add(new Example("asre name", 6, "Example detail 1", "Example detail 2", R.drawable.6_icon, "Example detail 3"));
        listExample.add(new Example("yuoi name6", 7, "Example detail 1", "Example detail 2", R.drawable.7_icon, "Example detail 3"));
        listExample.add(new Example("oiuy name", 8, "Example detail 1", "Example detail 2", R.drawable.8_icon, "Example detail 3"));
        listExample.add(new Example("fdsa name", 9, "Example detail 1", "Example detail 2", R.drawable.9_icon, "Example detail 3"));
        listExample.add(new Example("lkjh name", 10, "Example detail 1", "Example detail 2", R.drawable.10_icon, "Example detail 3"));
}

以及我写的搜索方法:

public void filter(String search) {
        Example ex;
        String s = search.trim().toLowerCase();
        String t;

        for (int i = 0; i < listExample.size(); i++) {
            ex = listExample.get(i);
            t = ex.getName().trim().toLowerCase();
            if (!t.contains(s)){
                listExample.remove(ex);
            }
        }

    }

以及获取中的文本何时更改的代码

searchText = (EditText) findViewById(R.id.txt_search);
        searchText.addTextChangedListener(new TextWatcher(){

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            if (!searchText.getText().toString().trim().isEmpty()){
                listExample = exList.getListExample();
                exList.filter(searchText.getText().toString());
                populateListView();
            }
            if (searchText.getText().toString().trim().isEmpty()){
                listExample = exList.getListExample();
                populateListView();
                //this resets the listview and actually works
            }


        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });

我的 arrayadapter 类和 populatelistview 方法

private void populateListView() {
        ArrayAdapter<Example> adapter = new MyListAdapter();
        ListView list = (ListView) findViewById(R.id.exampleListView);
        list.setAdapter(adapter);
    }

private class MyListAdapter extends ArrayAdapter<Example> {
        public MyListAdapter() {
            super(MainActivity.this, R.layout.item_view, listExample);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = convertView;
            if (itemView == null) {
                itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
            }
            Example currentExample = listExample.get(position);

            ImageView imageView = (ImageView)itemView.findViewById(R.id.item_image);
            imageView.setImageResource(currentExample.getIconId());

            TextView detailThreeText = (TextView) itemView.findViewById(R.id.item_txtDThree);
            detailThreeText.setText(currentExample.getDThree());

            TextView detailTwoText = (TextView) itemView.findViewById(R.id.item_txtDTwo);
            detailTwoText.setText(currentExample.getDTwo());

            TextView detailOneText = (TextView) itemView.findViewById(R.id.item_txtDOne);
            detailOneText.setText(currentExample.getDOne());

            TextView nameText = (TextView) itemView.findViewById(R.id.item_txtName);
            nameText.setText(currentExample.getName());



            return itemView;
        }

【问题讨论】:

  • 你的意思是:它似乎过滤掉了它想要的那些?
  • 自动完成列表视图对您的情况有帮助吗?
  • 我不希望搜索栏自动完成。
  • 我的意思是过滤掉它想要的任何东西,假设我在 EditText 中输入 ghk,而不是只显示示例“ghky name”和“ghkj name”,它会显示其他一些示例名称中没有 ghk

标签: java android listview arraylist


【解决方案1】:

我试着在这里写一些通用代码,修改它并告诉我。不要用单独的函数来比较,在onTextChanged里面做吧

searchText.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
                    // TODO Auto-generated method stub

                    String searchString = searchText.getText().toString();
                    int textLength = searchString.length();

                    ArrayList<String> searchList = new ArrayList<String>;
                    //searchList.clear(); 

                    for (int i = 0; i < listExample.size(); i++) {
                        Example model = listExample.get(i);
                        String Names = model.getName().toString();
                        if (textLength <= Names.length()) {
                            // compare the String in EditText with Names in the
                            // ArrayList
                            if (searchString.equalsIgnoreCase(Names.substring(
                                    0, textLength)))
                                searchList.add(listExample.get(i));
                        }
                    }

                    ArrayAdapter<Example> ad = new YOUR_ADAPTER(
                            YOUR_CLASS.this, searchList);
                    YOUR_LISTVIEW.setAdapter(ad);
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub

                }
            });

【讨论】:

  • searchList.add(listExample.get(i));不起作用,因为 searchlist 是字符串的 ArrayList,我想要的不仅仅是列表视图中的字符串。不过,我会尝试解决这个问题,如果我发布我的 arrayadapter,你能提供更多帮助吗?
  • 是的,如果我的回答对您有帮助,我只会在您接受并投票的情况下:D
  • 尝试将ArrayList&lt;String&gt; searchList = new ArrayList&lt;String&gt;;更改为List&lt;Example&gt; searchList = new ArrayList&lt;Example&gt;;
  • 我添加了 ArrayAdapter 的代码,如果您能提供帮助,我很乐意为您的答案投票。
  • 我改变了 ArrayList searchList = new ArrayList;到 List searchList = new ArrayList;并更改了 ArrayAdapter ad = new YOUR_ADAPTER(YOUR_CLASS.this, searchList);YOUR_LISTVIEW.setAdapter(ad);到 listExample = searchList;填充列表视图();效果很好。
【解决方案2】:

说真的,你做错了什么。找出问题的最快方法是调试应用程序,通过断点逐步执行。在每个断点,检查重要值的值。在某些时候,你会发现你的假设是不正确的。例如,您会发现比较操作无法正常工作。

相信我,这是解决问题的最快方法。我们这里的其他人可能会阅读您的代码几个小时,试图找到错误,但通过调试您可能会在几分钟内找到问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多