首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java ArrayList 中 Date 對象降序排序並顯示在 ListView 的方法

     編輯:程式設計綜合問答

在 Java 中對包含 Date 對象的 ArrayList 進行降序排序,並顯示在 ListView 中,核心是使用 Collections.sort() 配合自定義 Comparator。

問題代碼分析


// 原代碼嘗試在獲取數據時排序,邏輯混亂
Map dateMap = new TreeMap<>(new Comparator() {
    public int compare(Date d1, Date d2) {
        return d1.compareTo(d2); // 升序
    }
});
// 且未實際用於排序列表數據

正確解決方案

1. 數據模型包含 Date 字段


public class DataItem {
    public Date submitDate; // 或 lastModifiedDate
    public String title;
    // 其他字段...
}

2. 降序排序 (最新在前)


List list = DBAdapter.requestUserData(token);

// 方式一:Java 8+ Lambda (推薦)
list.sort((item1, item2) -> item2.submitDate.compareTo(item1.submitDate));
// 或
Collections.sort(list, (item1, item2) -> item2.submitDate.compareTo(item1.submitDate));

// 方式二:傳統 Comparator (Java 7 兼容)
Collections.sort(list, new Comparator() {
    @Override
    public int compare(DataItem o1, DataItem o2) {
        // 降序:o2 在前
        if (o1.submitDate == null && o2.submitDate == null) return 0;
        if (o1.submitDate == null) return 1;   // null 排最後
        if (o2.submitDate == null) return -1;
        return o2.submitDate.compareTo(o1.submitDate);
    }
});

3. 適配器直接使用排序後列表


// 排序後直接設置適配器
lv.setAdapter(new MyListAdapter(getApplicationContext(), list));

完整 Spinner 選項邏輯示例


spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView parent, View view, int position, long id) {
        List list = DBAdapter.requestUserData(token);
        
        switch (position) {
            case 0: // 默認排序 (或按 ID)
                // 不排序或按 ID 排序
                break;
            case 1: // 按提交時間降序 (最新優先)
                list.sort((a, b) -> {
                    if (a.submitDate == null && b.submitDate == null) return 0;
                    if (a.submitDate == null) return 1;
                    if (b.submitDate == null) return -1;
                    return b.submitDate.compareTo(a.submitDate);
                });
                break;
            case 2: // 按修改時間降序
                list.sort((a, b) -> {
                    if (a.lastModifiedDate == null && b.lastModifiedDate == null) return 0;
                    if (a.lastModifiedDate == null) return 1;
                    if (b.lastModifiedDate == null) return -1;
                    return b.lastModifiedDate.compareTo(a.lastModifiedDate);
                });
                break;
        }
        
        // 關鍵:排序後刷新適配器
        adapter.updateData(list); // 或重新 setAdapter
    }
    // ...
});

適配器更新數據的標準模式


public class MyListAdapter extends BaseAdapter {
    private List data = new ArrayList<>();
    
    public void updateData(List newData) {
        this.data.clear();
        if (newData != null) this.data.addAll(newData);
        notifyDataSetChanged(); // 通知 ListView 刷新
    }
    // ... getView 等方法
}

常見錯誤避坑

錯誤後果修正
Comparator 返回固定值排序無效、拋異常正確實現 compare 邏輯
未處理 null DateNPE 崩潰在 compare 中優先判斷 null
排序後未通知適配器UI 不更新調用 notifyDataSetChanged()
在 getView 中排序極度低效、閃爍在數據層排序、UI 只顯示

現代替代:RecyclerView + DiffUtil


// RecyclerView 適配器使用 ListAdapter + DiffUtil
class MyAdapter extends ListAdapter {
    MyAdapter() { super(DIFF_CALLBACK); }
    
    static DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback<>() {
        @Override boolean areItemsTheSame(DataItem old, DataItem new) { return old.id == new.id; }
        @Override boolean areContentsTheSame(DataItem old, DataItem new) { return old.equals(new); }
    };
    
    // 提交新列表自動計算差異動畫
    public void submitList(List list) { super.submitList(list); }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved