2

I am tryign to populate an ExpandableList items in android. Currently, I am getting the values of the headers from a string-array from the resources as follow:

String[] processesValues = context.getResources().getStringArray(R.array.processes);

Then I sort the Array using the following:

Arrays.sort(processesValues);

Afterward, I am loading the Array in the ArrayAdaptor list as follow:

ArrayAdapter<String> processesAdaptor = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, processesValues);

Now, the headers Array is sorted alphabetically, but the ArrayAdaptor list are not sorted. for example, if I have the following string-array in resouces:

<string-array name="processes">
    <item>cab</item>
    <item>abc</item>
    <item>bac</item>
</string-array>

I get and sort the Array like this:

> abc
> bac
> cab

then i try to put it in the ArrayAdapter, but the ArrayAdaptor show the following headers when running the app:

> cab
> abc
> bac

what am I doing wrong ?

UPDATE

here is my full code:

public class ExpandableListDataPump {

private static Context context;

public ExpandableListDataPump(Context current) {
    this.context = current;
}

public static HashMap<String, List<String>> getData() {

    String[] placesValues;

    Comparator<String> ALPHABETICAL_ORDER1 = new Comparator<String>() {
        public int compare(String object1, String object2) {
            int res = String.CASE_INSENSITIVE_ORDER.compare(object1.toString(), object2.toString());
            return res;
        }
    };


    placesValues = context.getResources().getStringArray(R.array.places);
    ArrayAdapter<String> locationsAdaptor = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList1 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor.getCount(); i++) {
        locationsList1.add((String) locationsAdaptor.getItem(i));
        Collections.sort(locationsList1, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places2);
    ArrayAdapter<String> locationsAdaptor2 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList2 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor2.getCount(); i++) {
        locationsList2.add((String) locationsAdaptor2.getItem(i));
        Collections.sort(locationsList2, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places3);
    ArrayAdapter<String> locationsAdaptor3 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList3 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor3.getCount(); i++) {
        locationsList3.add((String) locationsAdaptor3.getItem(i));
        Collections.sort(locationsList3, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places4);
    ArrayAdapter<String> locationsAdaptor4 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList4 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor4.getCount(); i++) {
        locationsList4.add((String) locationsAdaptor4.getItem(i));
        Collections.sort(locationsList4, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places5);
    ArrayAdapter<String> locationsAdaptor5 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList5 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor2.getCount(); i++) {
        locationsList5.add((String) locationsAdaptor5.getItem(i));
        Collections.sort(locationsList5, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places6);
    ArrayAdapter<String> locationsAdaptor6 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList6 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor2.getCount(); i++) {
        locationsList6.add((String) locationsAdaptor6.getItem(i));
        Collections.sort(locationsList6, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places7);
    ArrayAdapter<String> locationsAdaptor7 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList7 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor7.getCount(); i++) {
        locationsList7.add((String) locationsAdaptor7.getItem(i));
        Collections.sort(locationsList7, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places8);
    ArrayAdapter<String> locationsAdaptor8 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList8 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor8.getCount(); i++) {
        locationsList8.add((String) locationsAdaptor8.getItem(i));
        Collections.sort(locationsList8, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places9);
    ArrayAdapter<String> locationsAdaptor9 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList9 = new ArrayList<String>();
    for (int i = 0; i < locationsAdaptor9.getCount(); i++) {
        locationsList9.add((String) locationsAdaptor9.getItem(i));
        Collections.sort(locationsList9, ALPHABETICAL_ORDER1);
    }

    // -----------

    placesValues = context.getResources().getStringArray(R.array.places10);
    ArrayAdapter<String> locationsAdaptor10 = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, placesValues);
    List<String> locationsList10 = new ArrayList<String>();
    String placesValuesString10 = null;
    for (int i = 0; i < locationsAdaptor10.getCount(); i++) {
        locationsList10.add((String) locationsAdaptor10.getItem(i));
        Collections.sort(locationsList10, ALPHABETICAL_ORDER1);
    }

    // -----------

    List<List<String>> allLocationLists = new ArrayList<List<String>>();
    allLocationLists.add(locationsList1);
    allLocationLists.add(locationsList2);
    allLocationLists.add(locationsList3);
    allLocationLists.add(locationsList4);
    allLocationLists.add(locationsList5);
    allLocationLists.add(locationsList6);
    allLocationLists.add(locationsList7);
    allLocationLists.add(locationsList8);
    allLocationLists.add(locationsList9);
    allLocationLists.add(locationsList10);

    // ----------------

    HashMap<String, List<String>> expandableListDetail = new HashMap<String, List<String>>();

    String[] processesValues = context.getResources().getStringArray(R.array.processes);
    Arrays.sort(processesValues);

    ArrayAdapter<String> processesAdaptor = new ArrayAdapter<String>(context,
            R.layout.places_list_item, R.id.placeNameTv, processesValues);

    processesAdaptor.setNotifyOnChange(true);

    for (int i = 0; i < processesAdaptor.getCount(); i++) {
        String test = processesAdaptor.getItem(i).toString();
        System.out.println(test);
        expandableListDetail.put(processesAdaptor.getItem(i), allLocationLists.get(i));
    }

    return expandableListDetail;
}

}

8
  • Now, the headers Array is sorted alphabetically, but the ArrayAdaptor list are not sorted. what am I doing wrong. Can you elaborate what you mean by this? Commented Jan 31, 2017 at 15:19
  • please check the update, thanks ... @CKing Commented Jan 31, 2017 at 15:27
  • 4
    Are you sure you're not overwriting the sorted array somewhere? Is there any code in between these two parts..? Commented Jan 31, 2017 at 15:28
  • @Vucko : I just recheck again, no overwriting at all. I actually resorted the code so no overwriting happens at all. (i.e.: no code bewteen the two parts ) Commented Jan 31, 2017 at 15:47
  • @Luksprog : what I understood from you is that, firstly the Array that I am passing to the ArrayAdapter is shufled again randomly and go back to it is original order, so pre-sorting the Array has no affect what so ever, right ?! Commented Jan 31, 2017 at 15:56

1 Answer 1

2

Per the Android documentation, "setNotifyOnChange" will only trigger if you use the Adapter's functions to edit the list. You may need to call [youradapter].notifyDataSetChanged() after sorting.

https://developer.android.com/reference/android/widget/ArrayAdapter#setNotifyOnChange(boolean)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.