在ListView顶部显示新项目

时间:2012-08-31 19:16:42

标签: android list listview insert

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

8 个答案:

答案 0 :(得分:20)

默认情况下,list会在底部添加元素。这就是为什么你添加的所有新元素都将显示在底部。如果你想以相反的顺序,可能在设置listadapter / view之前反向列表

类似的东西:

Collections.reverse(yourList);

答案 1 :(得分:15)

另一个没有修改原始列表的解决方案,覆盖适配器

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

}

答案 2 :(得分:10)

您应该使用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);

答案 3 :(得分:3)

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

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

使用ArrayList,您可以通过 Collections.reverse(arrayList) 执行此操作,或者如果您使用的是SQLite,则可以使用 order by

答案 4 :(得分:2)

您可以在列表的开头添加元素:例如

public static void main(String args[]) {
    int j = 0;
    while (j++ <= 3) {
        // Create Scanner object to take input from command prompt
        Scanner s = new Scanner(System.in);
        // Take input from the user and store it in st
        String st = "";

        st = s.nextLine();

        if (st.equalsIgnoreCase("END")) {
            j = 5;
        }
        // Initialize the variable count to 0
        int count = 0;
        // Convert String st to char array
        char[] c = st.toCharArray();
        // Loop till end of string
        for (int i = 0; i < st.length(); i++) // If character at index 'i' is not a space, then increment count
        {
            if (c[i] != ' ') {
                count++;
            }
        }
        // Print no.of spaces
        System.out.printf("[%4d] spaces in ", +(st.length() - count));
        // Print no.of spaces
        System.out.println('"' + st + '"');
        j++;
    }
}

然后它将始终在顶部显示新元素。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

您可以随时在对象中添加日期戳,并根据该列表视图对列表视图进行排序。

   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()); 

这应该对您的列表进行排序,以使最新的项目位于顶部

答案 7 :(得分:0)

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