Search code examples
androidsortingandroid-listview

How to sort listview items by numeric values column in android


I have a listview lv with the following items in it:

Hyda, 25.00
Bran, 11.75
Geda, 2.55

I would like to sort the items by the second column so that the Listview will show:

Geda, 2.55
Bran, 11.75
Hyda, 25.00

The code I am using below sorts only by the first column; i.e it returns:

Bran, 11.75
Geda, 2.55
Hyda, 25.00

ArrayList<String> list = new ArrayList<>();
        ArrayAdapter<String> adapter;

        lv = rootView.findViewById(R.id.lvData);
        adapter = new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1, list);

        list.add("Hyda"+", "+"25.00");
        list.add("Bran"+", "+"11.75");
        list.add("Geda"+", "+"2.55");


        lv.setAdapter(adapter);


        btnSort = rootView.findViewById(R.id.sortButton);
        btnSort.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Collections.sort(list,new myComparatorNumbers());
                for (String i:list){
                   lv.setAdapter(adapter);
                }                
            }
        });

        private class myComparatorNumbers implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }

Can anyone help on how to sort it by the second column, i.e by the numeric values? Most of the solutions I found focus on one column data array


Solution

  • Seems like my older answer couldn't help you, I am adding the full implementation now. It should definitely help you

    class User {
        String name;
        double score;
    
        User(String name, double score) {
            this.name = name;
            this.score = score;
        }
    }
    

    MainActivity

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button sortButton = findViewById(R.id.sortButton);
            ListView lv = findViewById(R.id.lvData);
    
            List<User> data = new ArrayList<>();
            data.add(new User("Bran", 11.75));
            data.add(new User("Geda", 2.55));
            data.add(new User("Hyda", 25.00));
    
            final UsersAdapter adapter = new UsersAdapter(this, data);
            lv.setAdapter(adapter);
            sortButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    adapter.sortLvData();
                }
            });
        }
    }
    

    Custom Adapter class

    class UsersAdapter extends ArrayAdapter<User> {
    
        UsersAdapter(@NonNull Context context, List<User> users) {
            super(context, 0, users);
        }
    
        void sortLvData() {
            sort(new Comparator<User>() {
                @Override
                public int compare(User u1, User u2) {
                    return Double.compare(u1.score, u2.score);
                }
            });
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            User user = getItem(position);
            if (convertView == null) {
            //you can even use your custom XML layout to better display the UI.
            convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
            }
            String text = user.name + ", " + user.score;
            ((TextView) convertView).setText(text);
            return convertView;
        }
    }