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) |
此外,您还必须在适配器上调用