【问题标题】:Android Listview Searching from edittextAndroid Listview 从edittext搜索
【发布时间】:2013-12-17 09:47:17
【问题描述】:

现在我正在使用edittext 和listview 在android 中制作程序。我想使用上面的 edittext 搜索列表视图项。将数据填充到 listview 后,当用户在 edittext 中键入文本时,listview 将滚动到该文本开头的位置。示例:我有项目:苹果,应用程序,书,男孩,汽车,猫,现金.....当我在 edittext 中键入 b 时,listview 将滚动到书。我想使用 listview.setSelection(position),但我不知道如何从我的 edittext 搜索中获取位置。我希望每个人都可以帮助我。提前感谢!

【问题讨论】:

  • 我猜你正在使用 textwatcher.. 要么为过滤列表维护一个单独的数组列表,要么按内容比较 id

标签: android database listview android-listview android-fragments


【解决方案1】:

您可以按照以下步骤执行此操作。

  1. 检查用户输入的单词在您的列表视图中是否可用。
  2. 如果是,则分别获取该单词在数组列表或您的列表视图中的 id 或位置。
  3. 然后将选择设置为检索到的 ID。

如果您仍然无法获得 id,请发布您正在使用字符串数组自定义数组适配器的代码

溶胶:

你的情况可能是这样的

此代码应该在您的 oncreate 或您正在初始化列表视图的任何地方

HashMap<String,String> map=new HashMap<String, String>();
for(int i=0; i<arrlist.size();i++)
{
    map.put(arrlist.get(i).trim().toLowerCase(), ""+i+1);
}

从哈希映射中获取值 此代码将在您的搜索按钮上单击

 String id= map.get("yourserchitem")
 lv.setSelection(Integer.parseInt(id)-1); 

在文本转换器上写下这段代码 这里 e 是我的编辑文本的对象

e.addTextChangedListener(new TextWatcher() {

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

        }

        @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
            if(arr.contains(e.getText().toString().trim().toLowerCase()))
            {
                String id= map.get(e.getText().toString().trim().toLowerCase());
                lv.setSelection(Integer.parseInt(id)-1);
            }
        }
    });

使用 afterTextChanged 更改代码

String middle_string="";
             for(int i=0;i<arr.size();i++)
                {
                    if(arr.get(i).startsWith(e.getText().toString().trim().toLowerCase()))
                    {
                        middle_string=arr.get(i);
                        break;
                    }
                }
            if(arr.contains(middle_string))
            {
                String id= map.get(middle_string);
                lv.setSelection(Integer.parseInt(id)-1);
            }

【讨论】:

  • 我已经对此进行了测试:它可以工作,但我有超过 20,000 个条目,所以每次我的 edittext 更改时:它必须循环查找 ID,然后选择该 ID。所以,这使我的程序运行缓慢。我该怎么做才能让它运行得更快? : for(int i =0;i
  • 那么您应该将每个条目与一个 id 相关联。您可以为此使用哈希映射。在哈希映射中,使用名称作为键,使用 id 作为值,而不是遍历完整列表,您可以通过单击搜索按钮时将名称作为键来简单地获取 id。
  • 尊敬的先生,您能告诉我更多关于如何使用哈希映射的详细信息吗?请告诉我有关此的代码!谢谢
  • 我把这段代码放在哪里?我加入了 myedittext.Textchange() 事件,是否正确? for(int i =0;i
  • chk 编辑答案并使用 String id= map.get(s.toString().trim().toLowerCase());
【解决方案2】:

您听说过 AutoCompleteTextView(ACTV)。

只需将您必须的单词数组传递给 ACTV。因此,当用户开始输入单词时,将根据您拥有的单词数组进行预测。这更像是 google 即时搜索。尝试让我们知道

【讨论】:

  • 我知道!但就我而言,我想使用列表视图!你能告诉我该怎么做吗?
【解决方案3】:
public class MainActivity extends AppCompatActivity {

String [] items;
ArrayList<String> listview;
ArrayAdapter<String> adapter;
ListView lst_view1;
EditText edt_text1;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(activity_main);

    lst_view1 = (ListView)findViewById(R.id.lst_view1);
    edt_text1 = (EditText)findViewById(R.id.edt_text1);
    initlist();
    edt_text1.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().equals("")) {
                initlist();
            } else {
                searchItem(s.toString());
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
}

public void searchItem (String textTosearch){
    for(String item:items){
        if(!item.contains(textTosearch)){
            listview.remove(item);
        }
    }
    adapter.notifyDataSetChanged();
}

public void initlist() {
    items = new String [] {"iran","usa","canada","russia","tehran","yazd","esfahan","amir","rose",
            "hashemi","rezvani","ardebil","microsoft","google","amazon","tesla-motors"};
    listview = new ArrayList<>(Arrays.asList(items));
    adapter = new ArrayAdapter <String> (this, R.layout.list_item, R.id.txtview1 , listview);
    lst_view1.setAdapter(adapter);
}
}

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2016-04-30
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多