我实现了一个自定义比较器来对我的 ArrayList 进行排序,但是 listview 仍然没有排序

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

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

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

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

比较器:

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 是对象声明中的一个方法,它只是 returns 用户创建时分配给它的属性 sdate。

现在解决排序问题:

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

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 对象代码:

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:

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);

    }


    }

这里是声明列表适配器:

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 时才对列表进行排序

更改此条件

if (claimList.size() < 1)

if (claimList.size() > 1)

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