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