android - 对 ArrayAdapter 或 ArrayList 的内容进行排序

标签 android arraylist android-arrayadapter

我正在开发 android 项目,并且正在使用从 SQLite 数据库检索数据的 ListView。

我正在使用 ArrayList 创建数据集,然后将此 ArrayList 添加到 ArrayAdapter 中。

当从数据库中检索数据时,我告诉 SQLite 进行排序,以便所有内容在添加到 ListView 时都按字母顺序排列。在某些时候,信息将被动态添加到 ListView 中,而无需再次从数据库中重新获取所有内容。但是,我想按字母顺序排列所有内容。

我该怎么做,是对 DataSet 进行排序然后调用 notifyDataSet Changes,还是直接在 ArrayAdapter 上进行排序。我研究过在 ArrayAdapter 上执行排序,但这需要一个使用 Comparator 的参数,但不确定这是什么,并且找不到任何可能对我想要实现的目标有任何帮助的工作示例。

下面是填充数组和设置列表适配器的代码

ArrayList<Spanned> passwords = managePasswordList.getPasswordList();
        if (passwords != null && passwords.size() > 0)
        {
            passwordArrayAdapter = new ArrayAdapter<Spanned>(getActivity().getApplicationContext(), 
                    android.R.layout.simple_list_item_activated_1, passwords);
            setListAdapter(passwordArrayAdapter);
            myListView.setTextFilterEnabled(true);
            txtNoRecords.setVisibility(View.GONE);
        }
        else
        {
            txtNoRecords.setVisibility(View.VISIBLE);
        }

然后我将数据添加到数据集并使用以下命令刷新 ListView

String company = Encryption.decrypt(passwords.get(i).company);
                    String username = Encryption.decrypt(passwords.get(i).username);
                    details = Html.fromHtml(company + "<br />" + "<small><font color=\"#767676\">" + username + "</b></small>");    

密码.add(细节);
passwordArrayAdapter.notifyDataSetChanged();

感谢您提供的任何帮助。

更新 1 我已经尝试按照 Nick Bradbury 的建议进行操作,但我在使用比较器时遇到了问题。我有以下代码,但我不知道从这里去哪里。

SQLiteDatabase myDb = null;
        Cursor cursor = null;
        ArrayList<Spanned> passwords = new ArrayList<Spanned>();
        try
        {
            myDb = context.openOrCreateDatabase("PasswordManager", Context.MODE_PRIVATE, null);
            cursor = myDb.rawQuery("SELECT * FROM password ASC", null);
            while (cursor.moveToNext())
            {
                final String company = Encryption.decrypt(cursor.getString(2));
                final String username = Encryption.decrypt(cursor.getString(4));
                Spanned details = Html.fromHtml(company + "<br />" + "<small><font color=\"#767676\">" + username + "</b></small>");
                passwords.add(details);

                Collections.sort(passwords, new Comparator<Spanned>() {

                    public int compare(Spanned lhs, Spanned rhs) {
                        return 0;
                    }
                });
            }
        }
        catch (SQLiteException ex)
        {
            common.showBasicAlertDialog("Unfortunately something has gone wrong.\n\nWe will fix this as soon as we can", false);
            Log.e("Database Error", ex.toString());
            return null;
        }

在 return 语句中我不知道该怎么做,我试过 return lhs.compareTo 但是 lhs 和 rhs 变量没有 compareTo 函数所以我没有任何线索该怎么办。

最佳答案

这是一个使用 Comparator 对 ArrayList 进行排序的简单示例。在此示例中,ArrayList 定义为:

public class StatusList extends ArrayList<Status>

这个 ArrayList 的排序例程可能如下所示:

public void sort() {
    Collections.sort(this, new Comparator<Status>() {                
        @Override
        public int compare(Status item1, Status item2) {
            return item2.getDate().compareTo(item1.getDate());
        }
    });
}

替换为您的 ArrayList 包含的任何对象,然后更改比较以比较您希望作为排序依据的对象的值。

关于android - 对 ArrayAdapter 或 ArrayList 的内容进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12480984/

相关文章:

android - 如何禁用 SwipeRefreshLayout 中的触摸事件?

java - 在 Android 中更改 Activity 时如何保持 ArrayList 值

android - AutoCompleteTextView 不适用于自定义 ArrayAdapter

java - ArrayList 元素不被打印

java - 我的构造函数不会构造或 "return"应返回什么

android - 在 Button 的 Onclick 中从 Adapter 类重新加载 ListView 数据

android - 如何从 HashMap 绑定(bind) AutoCompleteTextView

android - 在 MvvmCross 中使用选项卡

android - target-densitydpi和window.innerWidth与Android H5有什么关系

android - 错误: this application requires the latest version of Google Play services for AR