Android 按距离重新订购适配器
Android re-order adapter by distance
我正在尝试按距离重新排序我的项目列表(使用 android getListView,而不是自定义),但我遇到了问题。
我正在使用 Maps Utils 在 适配器 ( SomeAdapter ) 中获取以米为单位的球面距离(双倍)。
double distance = SphericalUtil.computeDistanceBetween(fromCoord, toCoord);
但是在我填充适配器 (AsyncTask) 之后,我需要在我的 onPostExecute 上缩短距离,但我不知道。
@Override
protected void onPostExecute(Boolean result) {
try {
SQLiteHelper dbHelper = new SQLiteHelper(getActivity());
pds = new SomeDataSource(dbHelper.db);
ArrayList<Raids> some = pds.getAllRaids();
SomeAdapter listViewAdapter = new SomeAdapter(getActivity(), some);
getListView().setAdapter(listViewAdapter);
SharedPreferences somename = context.getSharedPreferences("SomeName", Context.MODE_PRIVATE);
Boolean UserOrder = somename.getBoolean("UserOrder", false);
if (UserOrder){
}
} catch (SQLiteException | NullPointerException s) {
Log.d("SomeName", "SomeFrag:", s);
}
}
谢谢
只需在 Raids
class -
中实现 Comparable
接口
class Raids implements Comparable<Raids> {
private double distance;
...
@Override
public int compareTo(Raids instance2) {
if (this.distance < instance2.distance)
return -1;
else if (this.distance > instance2.distance)
return 1;
else
return 0;
}
}
然后调用Collections.sort
就可以了-
ArrayList<Raids> some = pds.getAllRaids();
Collections.sort(some);
并更新适配器 -
listViewAdapter.notifyDataSetChanged();
鉴于您的代码:
ArrayList<Raids> some = pds.getAllRaids();
SomeAdapter listViewAdapter = new SomeAdapter(getActivity(), some);
你需要:
class SomeAdapter ... {
private ArrayList<Raids> mData;
//TODO: now call this method instead of computeDistanceBetween directly
private void calculateForitem(Raids item) {
double distance = SphericalUtil.computeDistanceBetween(item.fromCoord, item.toCoord);
item.setDistance(distance);
Collections.sort(mData); //the list inside adapter
notifyDataSetChanged();
}
}
和
class Raids implements Comparable<Raids> {
private double distance;
...
@Override
public int compareTo(Raids instance2) {
return (this.distance < instance2.distance)? -1 : (this.distance > instance2.distance)? 1 : 0;
}
}
我正在尝试按距离重新排序我的项目列表(使用 android getListView,而不是自定义),但我遇到了问题。
我正在使用 Maps Utils 在 适配器 ( SomeAdapter ) 中获取以米为单位的球面距离(双倍)。
double distance = SphericalUtil.computeDistanceBetween(fromCoord, toCoord);
但是在我填充适配器 (AsyncTask) 之后,我需要在我的 onPostExecute 上缩短距离,但我不知道。
@Override
protected void onPostExecute(Boolean result) {
try {
SQLiteHelper dbHelper = new SQLiteHelper(getActivity());
pds = new SomeDataSource(dbHelper.db);
ArrayList<Raids> some = pds.getAllRaids();
SomeAdapter listViewAdapter = new SomeAdapter(getActivity(), some);
getListView().setAdapter(listViewAdapter);
SharedPreferences somename = context.getSharedPreferences("SomeName", Context.MODE_PRIVATE);
Boolean UserOrder = somename.getBoolean("UserOrder", false);
if (UserOrder){
}
} catch (SQLiteException | NullPointerException s) {
Log.d("SomeName", "SomeFrag:", s);
}
}
谢谢
只需在 Raids
class -
Comparable
接口
class Raids implements Comparable<Raids> {
private double distance;
...
@Override
public int compareTo(Raids instance2) {
if (this.distance < instance2.distance)
return -1;
else if (this.distance > instance2.distance)
return 1;
else
return 0;
}
}
然后调用Collections.sort
就可以了-
ArrayList<Raids> some = pds.getAllRaids();
Collections.sort(some);
并更新适配器 -
listViewAdapter.notifyDataSetChanged();
鉴于您的代码:
ArrayList<Raids> some = pds.getAllRaids();
SomeAdapter listViewAdapter = new SomeAdapter(getActivity(), some);
你需要:
class SomeAdapter ... {
private ArrayList<Raids> mData;
//TODO: now call this method instead of computeDistanceBetween directly
private void calculateForitem(Raids item) {
double distance = SphericalUtil.computeDistanceBetween(item.fromCoord, item.toCoord);
item.setDistance(distance);
Collections.sort(mData); //the list inside adapter
notifyDataSetChanged();
}
}
和
class Raids implements Comparable<Raids> {
private double distance;
...
@Override
public int compareTo(Raids instance2) {
return (this.distance < instance2.distance)? -1 : (this.distance > instance2.distance)? 1 : 0;
}
}