Сортировка ArrayList с объектами с использованием Comparator и Custom ArrayAdapter

Как правильно отсортировать ArrayList объектов с помощью Comparator, а затем передать этот отсортированный массив в пользовательский адаптер массива?

Я пытался так:

Класс содержимого ArrayList:

public class CoursesData {
private String url;
private String name;
private String lessonsCount;
private String isFree;
private String price;
private String language;
private String difficulty;

private AuthorData author;

.....getters-setters
}

Компаратор:

class CoursesPriceComparator implements Comparator <CoursesData> {
public int compare (CoursesData left, CoursesData right){
    return left.getPrice().compareTo(right.getPrice());
}
}

Настройка адаптера в OnCreate:

        mAdapter = new CoursesItemAdapter(getActivity(),
            R.layout.catalog_list_item,
            Collections.sort(parserJson.getCourses(), new CoursesPriceComparator()));

..и получаю ошибку здесь:введите описание изображения здесь

... так как я использую пользовательский ArrayAdapter, который похож на:

class CoursesItemAdapter extends ArrayAdapter<CoursesData> {
private Activity myContext;
private ArrayList<CoursesData> datas;

public CoursesItemAdapter(Context context, int textViewResourceId, ArrayList<CoursesData> objects){
    super(context, textViewResourceId, objects);

    myContext = (Activity) context;
    datas = objects;
}

public View getView(int position, View convertView, ViewGroup parent){
    ViewHolder viewHolder;

    if(convertView == null) {
        LayoutInflater inflater = myContext.getLayoutInflater();
        convertView = inflater.inflate(R.layout.catalog_list_item, null);

        viewHolder = new ViewHolder();
        viewHolder.postNameView = (TextView) convertView.findViewById(R.id.courses_name);
        viewHolder.postDifficultyView = (TextView) convertView.findViewById(R.id.difficulty);
        viewHolder.postAuthorView = (TextView) convertView.findViewById(R.id.author);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }


    viewHolder.postNameView.setText(datas.get(position).getName());
    viewHolder.postAuthorView.setText(datas.get(position).getAuthor().getName());
    viewHolder.postDifficultyView.setText(datas.get(position).getDifficulty());

    return convertView;
}
    static class ViewHolder{
    TextView postNameView;
    TextView postAuthorView;
    TextView postDifficultyView;
}

Как мне нужно изменить этот адаптер, чтобы он работал с Comparable?

Спасибо за любую помощь.

1 ответ

Решение

Ваше предположение, что Collections.sort( возвращает отсортированную коллекцию неправильно.

mAdapter = new CoursesItemAdapter(getActivity(),
            R.layout.catalog_list_item,
            Collections.sort(parserJson.getCourses(), new CoursesPriceComparator()));

так должно быть

ArrayList< CoursesData > data = parserJson.getCourses();
Collections.sort(parserJson.getCourses(), new CoursesPriceComparator())
mAdapter = new CoursesItemAdapter(getActivity(),
            R.layout.catalog_list_item,
            data);

Collection.sort возвращаемый тип void. Проверьте здесь документацию

Другие вопросы по тегам