我有一个自定义arraylist,其中包含多个参数以及时间。
我想根据asending和desending格式的时间参数对该列表进行排序
我搜索了很多 这是一些链接 Sort objects in ArrayList by date?
Sort ArrayList with times in Java
还有更多 但没有一个工作
这是我的代码
功能调用点击
private void callTimeSorting(ArrayList<ObjectClass>solutions){
try{
ArrayList<ObjectClass> tempList = new ArrayList<>();
if (tempList.size() > 0){tempList.clear();}
tempList.addAll(solutions);
if (mTimeTag == 1) {
if (!mAsendingTime) {
Collections.sort(tempList, AsendingTimeComparator);
mAsendingTime = true;
mAdapter.notify();
} else {
Collections.sort(tempList, DesendingTimeComparator);
mAsendingTime = false;
}
}
}
OnClick方法
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.tvTimings :
mTimeTag = 1 ;
callTimeSorting(mSolutions) ;
mAdapter.notifyDataSetChanged();
break;
}}
AsendingComparator
private static Comparator<ObjectClass> AsendingTimeComparator = new Comparator<ObjectClass>() {
@Override
public int compare(ObjectClass solution1, ObjectClass solution2) {
String time1 = solution1.getDepartureDateTime();
String time2 = solution2.getDepartureDateTime();
return time1.compareTo(time2);//asending
}
};
private static Comparator<ObjectClass> DesendingTimeComparator = new Comparator<ObjectClass>() {
@Override
public int compare(ObjectClass solution1, ObjectClass solution2) {
String time1 = solution1.getDepartureDateTime();
String time2 = solution2.getDepartureDateTime();
return time2.compareTo(time1);//descending
}
};
我不知道为什么我的排序列表没有附加到recyclerView ??
答案 0 :(得分:3)
使用适配器中使用的原始列表,而不是临时列表
private void callTimeSorting(ArrayList<ObjectClass>solutions){
try{
ArrayList<ObjectClass> tempList = new ArrayList<>();
tempList.addAll(solutions);
solutions.clear();
if (mTimeTag == 1) {
if (!mAsendingTime) {
Collections.sort(tempList, AsendingTimeComparator);
mAsendingTime = true;
} else {
Collections.sort(tempList, DesendingTimeComparator);
mAsendingTime = false;
}
solutions.addAll(tempList);
mAdapter.notifyDataSetChanged();
}
}
答案 1 :(得分:2)
您的列表未进行排序,因为您正在对tempList进行排序:
Collections.sort(tempList, AsendingTimeComparator);
而不是您的适配器使用的实际列表,即解决方案。
您不应该使用临时列表并直接对解决方案进行排序。
private void callTimeSorting(ArrayList<ObjectClass>solutions){
try{
if (mTimeTag == 1) {
if (!mAsendingTime) {
Collections.sort(solutions, AsendingTimeComparator);
mAsendingTime = true;
mAdapter.notify();
} else {
Collections.sort(solutions, DesendingTimeComparator);
mAsendingTime = false;
}
}
}
答案 2 :(得分:1)
使用mList的参考 ....在您的代码中不要再次初始化它..使用clear()
代替new Arraylist<>
并且不要将任何其他引用分配给列表如list = new_List;
mAdapter将失去对列表的引用...并且不会相应地工作..(notifyDataSetChanged()将不起作用。