为 Android 排序 ArrayAdapter

Posted

技术标签:

【中文标题】为 Android 排序 ArrayAdapter【英文标题】:Sorting ArrayAdapter for Android 【发布时间】:2012-07-15 17:08:55 【问题描述】:

我有一个 MultiAutoCompleteTextView,可让您输入多个条目并显示自动完成建议。当我提交我的数据时,我的问题就出现了。我正在将任何输入的字符串添加到下拉列表中,但我尝试对数据进行排序失败。提交时执行的代码:

final private Comparator<String> comp = new Comparator<String>() 
    public int compare(String e1, String e2) 
        return e1.toString().compareTo(e2.toString());
    
;

((ArrayAdapter<String>) autoCompleteView.getAdapter()).add(getString());                    
((ArrayAdapter<String>) autoCompleteView.getAdapter()).sort(comp);  

点击 autoCompleteView 时发生的代码:

        view.setOnClickListener(new OnClickListener() 

            public void onClick(View v) 
                adapter.getFilter().filter(null);
                //adapter.sort(comp);
                view.showDropDown();
            
        );

任何人都可以发现我所做的事情有什么问题吗?

编辑:在合并@Sam 的更改后获得更多信息

private ArrayList<String> array = new ArrayList<String>();
private ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,
        array);

private void setUpAutoComplete(final MultiAutoCompleteTextView view)

    array.add("test string");   // this is successfully added to the drop down list
    Collections.sort(array, comp);
    adapter.notifyDataSetChanged();


private void onSubmit()

    array.add(getString()); // this fails to add
    adapter.notifyDataSetChanged();

【问题讨论】:

【参考方案1】:

但我尝试对数据进行排序失败

这有点模糊。但我会猜测一下。

首先你做一些多余的事情:

return e1.toString().compareTo(e2.toString());

由于e1e2 已经是字符串,因此您无需调用String#toString()。这个基本的字符串比较器也已经存在。所以你不需要这些。

更好的技术是对 List 进行排序,而不是对适配器进行排序。只需使用 Collections 的排序方法:

List<String> list = new ArrayList<String>();
list.add(getString());
...

Collections.sort(list);
adapter.notifyDataSetChanged();

请注意,我将 adapter.add() 更改为 list.add()。我这样做是因为adapter.add() 调用list.add() adapter.notifyDataSetChanged() 但适配器不应该更新,直到新列表排序之后。

【讨论】:

谢谢。我已将此代码添加到提交时执行的部分中,但下拉列表根本不会随新条目更新。但是,当我将代码添加到初始化适配器的部分时,添加的字符串已成功添加。这听起来像是(线程)无法修改现有数据的问题吗? 我看不到你在哪里使用线程或整体上下文,所以我不能确定...... getString() 只是 view.getText();我也尝试过对其进行硬编码,结果相同。 你确认onSubmit()被调用了吗? 谢谢@Sam。事实证明,在使用您的解决方案更新数组后,我只需要重新创建适配器并将其重新分配给视图。

以上是关于为 Android 排序 ArrayAdapter的主要内容,如果未能解决你的问题,请参考以下文章

Android - ArrayAdapter:将 TextView 设置为 SQLiteDatabase 中的值

Android 按字母顺序对 ListView 进行排序

Android_适配器(adapter)之ArrayAdapter

ArrayAdapter 要求 ID 为 TextView 错误

带有 ArrayAdapter 的 ListView 未在 Android 11 上显示内容

Android View 不会通过滑动手势滚动,也不会滚动。将 ListView 与 ArrayAdapter 一起使用