【问题标题】:Display new items at the top of a ListView在 ListView 顶部显示新项目
【发布时间】:2012-08-26 15:00:06
【问题描述】:

我正在使用列表来填充 ListView()。用户能够将项目添加到列表中。但是,我需要将项目显示在 ListView 的顶部。如何在列表的开头插入一个项目以便以相反的顺序显示它?

【问题讨论】:

  • 数据的来源是什么?如果您从数据库中读取它,您始终可以使用 order by 或等效项更改查询返回的顺序。

标签: android list listview insert


【解决方案1】:

默认情况下,列表在底部添加元素。这就是为什么您添加的所有新元素都将显示在底部的原因。如果您希望它以相反的顺序排列,可以在设置为 listadapter/view 之前反转列表

类似:

Collections.reverse(yourList);

【讨论】:

  • 好主意,但我一直在列表中添加项目并不断反转它,我基本上是以交替的方式在列表的每一端添加一个项目。由于我需要使用只保存基本数据类型的 SharedPreferences 保存数据,因此跟踪两个列表会很麻烦。
  • 很好,但是当您尝试使用对象自定义+标签时不起作用!
  • @delive:自定义对象时,需要在自定义类users.csc.calpoly.edu/~kmammen/documents/java/…中重写equals()和hashcode()方法。
  • 我知道但更改背景@override click listview (在我的情况下为 ExpandableListView) 的位置,但我来自服务器的数据并不能正常工作我尝试所有形式,shenhengbin.wordpress.com/2012/03/25/… 这个例子动态地你可以' t :),你可以试试 :)
【解决方案2】:

另一种不修改原始列表的方案,覆盖Adapter中的getItem()方法

@Override
public Item getItem(int position) {
    return super.getItem(getCount() - position - 1);
}

更新:示例

public class ChatAdapter extends ArrayAdapter<ChatItem> {
public ChatAdapter(Context context, List<ChatItem> chats) {
    super(context, R.layout.row_chat, chats);
}

@Override
public Item getItem(int position) {
    return super.getItem(getCount() - position - 1);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null) {
        convertView = inflater.inflate(R.layout.row_chat, parent, false);
    }

    ChatItem chatItem = getItem(position);
    //Other code here

    return convertView;
}

}

【讨论】:

  • 这是一个非常优雅的解决方案。我做了一个小改动,所以我可以在不公开数据项的匿名 ArrayAdapter 中使用它:return super.getItem(getCount() - 1 - position);
  • 这可行,但是当滚动列表中的第一项时,似乎与最后一项列表重复。我认为这个问题与列表视图项目的回收有关(不确定)。
  • 您能告诉我如何覆盖适配器中的 getItem() 方法吗?
  • 不能单选改变颜色,因为总是选择倒置返回 super.getItem(getCount() - position - 1);
【解决方案3】:

您可能应该使用ArrayAdapter 并使用insert(T, int) 方法。

例如:

ListView lv = new ListView(context);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.id...);
lv.setAdapter(adapter);
...
adapter.insert("Hello", 0);

【讨论】:

  • 我刚刚取消了我的清单,并且很认真地使用了适配器。工作得很好!谢谢。
【解决方案4】:

ListView 显示存储在数据源中的数据。

当您在数据库中添加时,它必须在最后添加元素。因此,当您通过 Cursor 对象获取所有数据并将其分配给 ArrayAdapter 时,它仅按该顺序排列。您基本上应该尝试将数据放在数据库的开头,而不是最后,可能有一些时间戳。

使用 ArrayList,你可以通过 Collections.reverse(arrayList) 来完成,或者如果你使用 SQLite,你可以使用 order by

【讨论】:

  • 不,我认为这是错误的。对于列表视图,您需要将数组/列表作为输入传递。在数据库中,除非你有插入的时间戳,否则你什么都做不了。
  • @Nambari:对不起。我的真正意思是通过使用 Cursor 对象从数据库中检索数据,然后将其放入 ArrayAdapter 中。像这样stackoverflow.com/questions/5717732/…。将更新我的答案。感谢您的评论。
【解决方案5】:

可以在列表开头添加元素:like

arraylist.add(0, object)

那么它将始终在顶部显示新元素。

【讨论】:

  • 完美答案:)
【解决方案6】:

mBlogList 是一个回收站视图...

mBlogList=(RecyclerView) findViewById(R.id.your xml file);
mBlogList.setHasFixedSize(true);


LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
mBlogList.setLayoutManager(mLayoutManager);//VERTICAL FORMAT

【讨论】:

    【解决方案7】:

    您总是可以在您的对象中有一个日期戳,并根据它对您的列表视图进行排序..

       public class CustomComparator implements Comparator<YourObjectName> {
            public int compare(YourObjectName o1, YourObjectName o2) {
                return o1.getDate() > o2.getDate() // something like that.. google how to do a compare method on two dates
            }
        }
    

    现在对您的列表进行排序

    Collections.sort(YourList, new CustomComparator()); 
    

    这应该对您的列表进行排序,以便最新的项目排在最前面

    【讨论】:

      【解决方案8】:

      您始终可以使用 LinkedList 代替,然后使用 addFirst() 方法将元素添加到列表中,它将具有所需的行为(ListView 顶部的新项目)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        • 2020-12-11
        • 2016-03-01
        • 1970-01-01
        相关资源
        最近更新 更多