【问题标题】:Sorting Android ListView排序Android ListView
【发布时间】:2010-04-14 07:48:38
【问题描述】:

我只是从 Android 开发开始,虽然 Milestone 是一款不错的设备,但 Java 不是我的自然语言,我在 Android SDK、Eclipse 和 Java 本身的 Google 文档方面都在苦苦挣扎。总之……

我正在为 Android 编写一个微博客户端,以配合我的 Windows 客户端 (MahTweets)。目前,我的推文不断来来去去,问题出在 UI 上。

初始调用将正确排序项目(从最高到最低)

  • 3
  • 2
  • 1

刷新时

  • 3
  • 2
  • 1
  • 6
  • 5
  • 4

推文处理完毕后,我打电话给adapter.notifyDataSetChanged(); 最初我认为需要对 Adapter 上的 getItem() 进行排序(下面的代码是我最终得到的),但我仍然没有运气。

public class TweetAdapter extends BaseAdapter
{
private List<IStatusUpdate> elements;
private Context c;
public TweetAdapter(Context c, List<IStatusUpdate> Tweets)
{
    this.elements = Tweets;
    this.c = c;
}
public int getCount() {

    return elements.size();
}
public Object getItem(int position) {
    Collections.sort(elements, new IStatusUpdateComparator());
    return elements.get(position);
}
public long getItemId(int id) {
    return id;
}
public void Remove(int id)
{   
    notifyDataSetChanged();
}
public View getView(int position, View convertView, ViewGroup parent) 
{
    RelativeLayout rowLayout;
    IStatusUpdate t = elements.get(position);
            rowLayout = t.GetParent().GetUI(t, parent, c);
    return rowLayout;
}

class IStatusUpdateComparator implements Comparator
{
    public int compare(Object obj1, Object obj2)
    {
        IStatusUpdate update1 = (IStatusUpdate)obj1;
        IStatusUpdate update2 = (IStatusUpdate)obj2;
        int result = update1.getID().compareTo(update2.getID());

        if (result == -1)
        return 1;
        else if (result == 1)
        return 0;
        return result;
    }
}
}

有没有更好的方法在 Android 中对 ListView 进行排序,同时仍然能够使用 LayoutInflater? (rowLayout = t.GetParent().GetUI(t, parent, c)将UI扩展为微博实现可以提供的具体视图)

【问题讨论】:

    标签: java android listview


    【解决方案1】:

    我不建议在 getItem() 中对底层列表进行排序,我认为 get..() 方法应该是“幂等的”,并且对其父级的状态没有任何外部可见的影响。

    对于您的问题,我会在将推文添加到容器时解决它。您尚未将这部分包含在您的应用程序源代码中,但您似乎正在使用 ArrayList。也许您正在 Twitter API 中查询最近排序的推文列表,并为每个结果在 ArrayList 上调用 add(),这会将推文添加到列表的底部。

    您知道您可以随时插入到 ArrayList 中吗?我建议 reverse 遍历 Twitter API 的结果,并使用 add(0, ....) 将每个结果插入到 ArrayList 的顶部,而不是添加到列表的后面。

    【讨论】:

    • 是的,你是对的,我使用的是 ArrayList。至于把它放在 getItem() 中,你是对的,我不打算把它放在那里,但我对 Android 有点困惑;)在任何点(或零)插入的问题是当你遇到多个帐户(或多个插件)。 AccountA 的调用可能发生在 AccountB 之后,而 AccountA 的更新都是 /after/ AccountB 的(希望这是有道理的)。快速修复永远不会允许同时显示两个帐户,我宁愿不这样做。当然,我猜可以在插入时进行排序吗?
    • 我推荐的主要原则是对底层数据模型进行排序,而不是尝试在 ListAdapter 级别更改排序顺序。 可能可以在该级别进行排序,但是由于您难以使其正常工作,因此我会采用更简单的方法。关于多插件问题,对于移动应用程序来说这听起来相当复杂。我不确定您是在描述 Java 访问并发问题还是与您正在处理的数据存在逻辑悖论。如果是前者,有办法解决这个问题(并发安全容器)。后者,我会在 ... 之后添加自己的排序逻辑
    • 谢谢吉姆,我已经通过将它移动到数组的插入逻辑中来实现它。来自 WPF/XAML,我习惯于对 UI 标记本身进行排序。这是一个糟糕的借口,我知道。
    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多