В настоящее время я создаю приложение для Android для школы, но все еще хочу выкладываться на полную.
Я новичок в разработке и программировании под Android в целом. Приложение должно быть игрой на фондовом рынке. (Кстати, я немец, поэтому могут быть некоторые немецкие переменные)
Итак, я хочу отсортировать свой RecyclerView, содержащий общие ресурсы. Он работает по алфавиту, но не по ценности.
Я могу гарантировать, что имя "worth" двойника в JSONObject правильное. Что я делаю не так?
public class CompanyAdapter extends RecyclerView.Adapter<CompanyAdapter.viewHolder> implements Filterable {
private CustomFilter filter;
private ArrayList<JSONObject> jObjList;
private final String keyName;
private final String keyWorth;
private final String keyChange;
public final static int SORT_ALPHABETICALLY = 0;
public final static int SORT_ALPHABETICALLY_REVERSE = 1;
public final static int SORT_BY_WORTH = 2;
public final static int SORT_BY_WORTH_REVERSE = 3;
public CompanyAdapter(Context context, ArrayList<JSONObject> jObjList) {
this.jObjList = jObjList;
Context c = context;
keyName = c.getResources().getString(R.string.nameCompany);
keyWorth = c.getResources().getString(R.string.worthCompany);
keyChange = c.getResources().getString(R.string.changeCompany);
sort(SORT_ALPHABETICALLY);
}
//left out some unnecessary code
public void sort (int sorting) {
if (jObjList.size()>1) {
switch (sorting) {
case SORT_ALPHABETICALLY:
sortAlphabetically();
break;
case SORT_ALPHABETICALLY_REVERSE:
sortAlphabeticallyReverse();
break;
case SORT_BY_WORTH:
sortByWorth();
break;
case SORT_BY_WORTH_REVERSE:
sortByWorthReverse();
break;
}
}
}
private void sortAlphabetically () {
Collections.sort(jObjList, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject j1, JSONObject j2) {
try {
return j1.getString(keyName).compareToIgnoreCase(j2.getString(keyName));
} catch (JSONException e) {
return 0;
}
}
});
}
private void sortAlphabeticallyReverse () {
sortAlphabetically();
Collections.reverse(jObjList);
}
private void sortByWorth () {
Collections.sort(jObjList, new Comparator<JSONObject>() {
@Override
public int compare(JSONObject j1, JSONObject j2) {
try {
return Double.compare(j1.getDouble(keyWorth), j2.getDouble(keyWorth));
} catch (JSONException e) {
Log.e("JSONException", e.getMessage());
return 0;
}
}
});
}
private void sortByWorthReverse () {
sortByWorth();
Collections.reverse(jObjList);
}
}
Вы проверили значения сравниваемых объектов в консоли?
Поскольку вы читаете значения в виде строки, возможно, они не дадут ожидаемого результата.
Кроме того, какую операцию выполняет функция сравнения?
Заменять:
return Double.compare(j1.getDouble(keyWorth), j2.getDouble(keyWorth));
В методе sortByWorth:
return j1.getDouble(keyWorth).compareTo(j2.getDouble(keyWorth))
Попробуй..
Обычный double не имеет метода compareTo. Это строковый метод. Стоит ли попробовать преобразовать двойные в парные?
Вы попробуете что-то вроде этого: Double double1 = new Double (1.1); Double double2 = новый Double ("1,2"); double1.compareTo (double2);
попытаться заменить
return Double.compare(j1.getDouble(keyWorth), j2.getDouble(keyWorth));
с
System.out.print("VALUE1: "+j1.getDouble(keyWorth));
System.out.print("VALUE2: "+j2.getDouble(keyWorth));
return (int)(j1.getDouble(keyWorth)-j2.getDouble(keyWorth));
а также, чтобы убедиться и отладить значение, напечатайте его.
и после sortByWorth();
добавить notifyDataSetChanged();
Он печатает правильные значения, но все равно не работает.
Я отредактировал комментарий, Вы использовали notifyDataSetChanged (); ?
Я забыл notifyDataSetChanged(). Извините, это глупая ошибка.
Я проверил значение, и ресайклер действительно не отсортирован, если вы это имели в виду. О каких ценностях вы говорите? Вы можете увидеть это в коде.