Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort listview with array adapter

I have a listview connected to a custom array adapter. This list shows information received by a TCP connection which changes the dataSet...

I am able to sort the listview with sort (Comparator<? super T> comparator), but when the dataSet is changed, the listview is no more sorted...

I can use sort () every time the dataSet is changed, but I think this is not the best option...

How can I do that? Any suggestions?

EDIT

I am having problems in implementing the solutions presented...

MyComparatorB.java

public class MyComparatorB implements Comparator<DeviceB> {  private byte orderType;  public MyComparatorB(byte type) {      this.orderType = type;  }  public int compare(DeviceB lhs, DeviceB rhs) {      int res = 0;     if (orderType == SortType.ALPHA) {             res = (lhs.getName()).compareTo(rhs.getName());         }         else if (orderType == SortType.LAST_ACT) {             res = (rhs.getTime().getTime()).compareTo(lhs.getTime().getTime());         }         return res;     }  } 

Snippet of my customArrayAdapter.java

    @Override public void notifyDataSetChanged() {     super.notifyDataSetChanged(); }   //-----------Order the content of the arrayAdapter------------// public void sort(byte sortType) {      super.sort(new MyComparatorB(sortType));     notifyDataSetChanged(); } 

In my MyActivity.java

myDevAdapter.sort(SortType.ALPHA); 

When I am debugging, the method super.sort(new MyComparatorB(sortType)); is called and the constructor of MyComparatorB is called too. But the method compare(DeviceB lhs, DeviceB rhs) is never called and my arrayList is not sorted... What I am doing wrong?

like image 553
amp Avatar asked Mar 28 '12 11:03

amp


1 Answers

I guess you need to override notifyDataSetChanged method in your adapter and perform sorting right before calling its super. See below:

@Override public void notifyDataSetChanged() {     //do your sorting here      super.notifyDataSetChanged(); } 

Doing so will sort the list whenever you call notifyDataSetChanged method to refresh list items. Otherwise, feed a sorted List/array to your adapter.


Or more preferably, use the sort method available in your adapter to get the job done.

adapter.sort(new Comparator<String>() {     @Override     public int compare(String lhs, String rhs) {         return lhs.compareTo(rhs);   //or whatever your sorting algorithm     } }); 
like image 58
waqaslam Avatar answered Oct 10 '22 04:10

waqaslam