【问题标题】:Android sort Listview, according to user idAndroid排序Listview,根据用户id
【发布时间】:2016-11-18 12:16:45
【问题描述】:

我有一个包含 3 个不同值的列表视图。

值:
热门问题 (getField_top_problem)、
用户ID (getUid)
难度(getField_difficulty )

我想像这样对列表进行排序。

第一部分:
检查哪个用户已登录。获取该用户的所有热门问题。 登录用户的Top问题,需要先按照最难排序。

第二部分/列表的其余部分。
需要先按照最难的排序。是否存在来自其他未登录用户的 Top 问题无关紧要。(如果不确定,请检查图像 - 红色框)

如果还不清楚,我添加了一张图片。它应该看起来像这样。

到目前为止我的进步。
我能够对其进行排序,首先是所有用户的首要问题,而不仅仅是登录用户。需要根据登录用户的Top问题进行排序。登录用户的 id 保存为字符串。

//Example logged in user id (uid)
String uid = "2";

任何帮助将不胜感激。

 protected void onPostExecute(final List<OcdModel> result) {
        super.onPostExecute(result);
        dialog.dismiss();

        //uid - user id that is logged in.
        //Sort - Top problem of user logged in first.
        //sort the rest according to difficulty

        //check which user is logged in.
        //Boolean user1 = a1.getUid().equals(uid);

        Collections.sort(result, new Comparator<OcdModel>() {
            @Override
            public int compare(OcdModel a1, OcdModel a2) {

                //Top problem first. Arrange row with most difficult first in top problems list.
                Integer tp1 = Integer.parseInt(a1.getField_top_problem().toString());
                Integer tp2 = Integer.parseInt(a2.getField_top_problem().toString());
                int tpComp = tp1.compareTo(tp2);
                //return b1.compareTo(b2);
                if (tpComp != 0) {
                    return tpComp;
                } else {
                    int b1 = Integer.parseInt(a1.getField_difficulty().toString());
                    int b2 = Integer.parseInt(a2.getField_difficulty().toString());
                    return (int) (b1-b2);
                }
            }
        });
        Collections.reverse(result);
        //TODO Need to set data
        OcdListAdapter adapter = new OcdListAdapter(getApplicationContext(), R.layout.row_ocd_list, result);
        lvToolbox.setAdapter(adapter);
    }

提前致谢

【问题讨论】:

  • 你必须从 api 开发者那里得到帮助。您需要为每个请求传递不同的参数键和值,例如 sort : (first-part some value identifier) 、 sort : (second-part some value identifier) 等

标签: android sorting listview


【解决方案1】:

你需要像这样创建多个camparator

public class ModelChainedComparator implements Comparator<OcdModel> {
    private List<Comparator<OcdModel>> listComparators;
    @SafeVarargs
    public ModelChainedComparator(Comparator<OcdModel>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }
    @Override
    public int compare(OcdModel a1, OcdModel a2) {
        for (Comparator<OcdModel> comparator : listComparators) {
            int result = comparator.compare(a1, a2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}

public class ModelUserLoginComparator implements Comparator<OcdModel> {
    @Override
    public int compare(OcdModel a1, OcdModel a2) {
        return Boolean.valueOf(a2.isUserLogedIn).compareTo(Boolean.valueOf(a1.isUserLogedIn));
    }
}

public class ModelDeficultyComparator implements Comparator<OcdModel> {
    @Override
    public int compare(OcdModel a1, OcdModel a2) {
        int firstObject = Integer.parseInt(a1.getField_difficulty().toString());
        int secondObject = Integer.parseInt(a2.getField_difficulty().toString());
        return firstObject < secondObject ? 1 : (firstObject == secondObject ? 0 : -1);
    }
}

你必须像这样使用它

    ArrayList<OcdModel> list = getList();
    Collections.sort(list, new ModelChainedComparator(
                    new ModelUserLoginComparator(),
                    new ModelDeficultyComparator())
            );

如果不行请告诉我

【讨论】:

  • 只是一个简单的问题。在您的示例中,您在哪里检查它是否是登录用户?而不仅仅是比较用户ID?抱歉,我还是编程新手。
  • “你在哪里检查它是登录用户”我没有在我的代码中检查,但如果你想检查,你必须在你的 OcdModel 中添加一个字段
  • 喜欢 boolean isUserLogin 比检查 isUserLogin 是否为真而不是把它放在 ArrayList 中而不是排序只是给我一些时间都给你这个代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2017-10-01
相关资源
最近更新 更多