关于java:i实现了一个自定义比较器来对ArrayList进行排序,但listview仍未排序

i implemented a custom comparator to sort my ArrayList, but listview is still not sorted

好。我做了一个列表视图,可以看到我放在arraylist中的自定义对象名称。然后,我编写了代码以根据对象的开始日期(日期)对对象列表进行排序。

找不到解决我问题的方法。

但是,我不知道如何测试我的实现是否正常工作,因为我未看到对象的listview一直在排序,并且保留了将它们添加到列表中的顺序。这是供参考的代码。

比较器:

1
2
3
4
5
6
7
8
9
10
package app.zioueche_travelexpense;

import java.util.Comparator;

public class CustomComparator implements Comparator<Claim> {
    @Override
    public int compare(Claim c1, Claim c2) {
        return c1.getSDate().compareTo(c2.getSDate());
    }
}

其中,getSDate是对象Claim中的方法,它仅返回用户创建时为其分配的属性sdate。

现在要解决排序问题:

这里是我排序的地方。寻找评论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package app.zioueche_travelexpense;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

import android.text.InputFilter.LengthFilter;
import android.widget.Toast;

public class ClaimsList implements Serializable{

    /**
     * Claim List Serialization ID
     */

    private static final long serialVersionUID = 372301924739907840L;

    protected static ArrayList<Claim> claimList;
    protected ArrayList<Listener> listeners;

    public ClaimsList(){
        claimList = new ArrayList<Claim>();
        listeners = new ArrayList<Listener>();
    }

    public Collection<Claim> getClaim(){
        return claimList;
    }

    public void addClaim(Claim string){
        claimList.add(string);
        if (claimList.size() < 1){//SORTING HAPPENS HERE
            Collections.sort(claimList, new CustomComparator());
            notifyListeners();
        }else{
        notifyListeners();
    }}

    public void deleteClaim(Claim removeclaim){
        claimList.remove(removeclaim);
        notifyListeners();
    }

    public static boolean isEmpty(){
        return claimList.size()== 0;
    }

    public void notifyListeners(){
        for (Listener listener: listeners){
            listener.update();
        }
    }
    public void addListener(Listener l){
        listeners.add(l);
    }

    public void removeListener(Listener l){
        listeners.remove(l);

    }


}

如果您需要更多信息,请告诉我,但我确实需要解决此问题

这是CLaim目标代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package app.zioueche_travelexpense;

import java.io.Serializable;
import java.util.Date;
import java.util.ArrayList;

public class Claim implements Serializable{
    /**
     * Student serialized ID
     */

    private static final long serialVersionUID = 3325687864575767244L;
    private String Name;
    private ArrayList<Expense> expenseList;
    static Date sdate;
    private Date edate;
    private String status;

    //Claim object constructor NEED TO ADD STATUS
    public Claim(String Name, Date sdate2, Date edate2){
        this.Name = Name;
        this.expenseList = new ArrayList<Expense>();
        this.sdate = sdate2;
        this.edate = edate2;
        //this.status = status;
    }

    //get the claim name
    public String getName(){
        return this.Name;
    }

    //add an expense to the claim's expense list
    public void addExpense(Expense expense){
        expenseList.add(expense);
    }

    //change the name to a string.
    public String toString(){
        return getName();
    }

    //return the status of the string
    public String getStatus(){
        return status;
    }

    //get the start date of the claim
    public Date getSDate(){
        return sdate;
    }

    //get the end date of the claim
    public Date getEDate(){
        return edate;
    }

    //change the status of the Claim.
    public void editStatus(String status){
        this.status = status;
    }

    public boolean equal(Object compareClaim){
        if (compareClaim != null && compareClaim.getClass()==this.getClass()){
            return this.equals((Claim) compareClaim);
        }else{
            return false;
        }
    }

    public int hashCode(){
        return ("Claim"+getName()).hashCode();
    }

    //return the expenses list of the Claim
    public ArrayList<Expense> getExpenses() {
        // TODO Auto-generated method stub
        return expenseList;
    }
}

,然后是Controller和ClaimsList:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package app.zioueche_travelexpense;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class ClaimListController {
    private static ClaimsList claimList = null;

    static public ClaimsList getClaimList(){
        if (claimList == null){
            claimList = new ClaimsList();
        }
        return claimList;
    }

    public void addClaim(Claim claim){
        getClaimList().addClaim(claim);
    }
}

    package app.zioueche_travelexpense;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

import android.text.InputFilter.LengthFilter;
import android.widget.Toast;

    public class ClaimsList implements Serial

izable{

    /**
     * Claim List Serialization ID
     */

    private static final long serialVersionUID = 372301924739907840L;

    protected static ArrayList<Claim> claimList;
    protected ArrayList<Listener> listeners;

    public ClaimsList(){
        claimList = new ArrayList<Claim>();
        listeners = new ArrayList<Listener>();
    }

    public Collection<Claim> getClaim(){
        return claimList;
    }

    public void addClaim(Claim string){
        claimList.add(string);
        if (claimList.size() > 1){
            Collections.sort(claimList, new CustomComparator());
            notifyListeners();

        }else{
        notifyListeners();
    }}

    public void deleteClaim(Claim removeclaim){
        claimList.remove(removeclaim);
        notifyListeners();
    }

    public static boolean isEmpty(){
        return claimList.size()== 0;
    }

    public void notifyListeners(){
        for (Listener listener: listeners){
            listener.update();
        }
    }
    public void addListener(Listener l){
        listeners.add(l);
    }

    public void removeListener(Listener l){
        listeners.remove(l);

    }


    }

这是声明列表适配器:

1
2
3
4
5
ListView listView = (ListView) findViewById(R.id.claimListView);
    Collection<Claim> claims = ClaimListController.getClaimList().getClaim();
    final ArrayList<Claim> list = new ArrayList<Claim>(claims);
    final ArrayAdapter<Claim> claimAdapter = new ArrayAdapter<Claim>(this, android.R.layout.simple_list_item_1, list);
    listView.setAdapter(claimAdapter);

仅当列表大小为0时才对列表进行排序

更改此条件

1
if (claimList.size() < 1)

1
if (claimList.size() > 1)

此外,您还必须在适配器上调用notifyDataSetChanged()方法以刷新列表。