【问题标题】:Android re-order adapter by distanceAndroid 按距离重新排序适配器
【发布时间】:2018-02-14 20:15:34
【问题描述】:

我正在尝试按距离重新排序我的项目列表(使用 android getListView,而不是自定义),但我遇到了问题。

我正在使用 Maps Utils inside 适配器 ( 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);
        }
    }

谢谢

【问题讨论】:

  • 你用什么方法调用double distance = SphericalUtil.computeDistanceBetween(fromCoord, toCoord);
  • @NickCardoso 我的适配器,但你可以在任何地方调用它。

标签: java android sorting adapter


【解决方案1】:

只需在 Raids 类中实现 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();

【讨论】:

  • 嗨,距离是在适配器内部计算的,因为我获取实际坐标和新坐标(当前项目)并转换为米(双精度)。为什么将它放在 Raids 类中?班级如何知道该项目的正确距离?
  • Double 也没有保存在数据库中,我只用它在适配器内部计算和打印。
  • @FilipeOS 我假设distanceRaids 类的一个字段。如果不是,那么排序是不可能的,因为它需要类的成员来执行排序。你能更清楚地解释你在做什么吗?
  • 我从服务器获取坐标,保存在 sqllite 上,填充适配器并在每个项目上计算我的坐标与保存在 sqllite 上的坐标的球面距离(米/双倍)(每项目清单 )。我想按距离缩短列表,我只能在适配器内部检查这个,我猜想是在填充之后。请指教
  • @FilipeOS 您需要一个类的属性来根据该属性对该类的项目列表进行排序。所以Raids 类应该包含一个字段distance imo。然后,您应该在获取数据后计算并更新每个对象的distance,然后适配器可以简单地调用对象列表并在填充之前使用比较器对其进行排序。我认为你需要稍微重构一下代码。
【解决方案2】:

给定您的代码:

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

}

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2015-10-14
    • 2013-11-11
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多