2012-08-31 39 views
10

Tôi đang sử dụng danh sách để điền một ListView(). Người dùng có thể thêm các mục vào danh sách. Tuy nhiên, tôi cần các mục được hiển thị ở phía trên cùng của ListView. Làm thế nào để chèn một mục vào đầu danh sách của tôi để hiển thị nó theo thứ tự ngược lại?Hiển thị các mục mới ở đầu một ListView

+0

Nguồn dữ liệu là gì? Nếu bạn đang đọc nó từ một cơ sở dữ liệu, bạn luôn có thể thay đổi thứ tự truy vấn trả về bằng 'order by' hoặc tương đương. – MrLore

Trả lời

10

Có thể bạn nên sử dụng ArrayAdapter và sử dụng phương thức insert(T, int).

Ex:

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

Tôi vừa loại bỏ danh sách của mình và souly sử dụng bộ điều hợp. Làm việc tuyệt vời! Cảm ơn. – rphello101

+0

Bạn được chào đón! – aymeric

20

Theo danh sách mặc định, thêm các phần tử ở dưới cùng. Đó là lý do tại sao tất cả các yếu tố mới bạn thêm sẽ hiển thị ở dưới cùng. Nếu bạn muốn nó theo thứ tự ngược, có thể là trước khi thiết để listadapter/xem ngược danh sách

Cái gì như:

Collections.reverse(yourList); 
+0

Ý tưởng hay, nhưng tôi tiếp tục thêm các mục vào danh sách và tiếp tục đảo ngược nó, về cơ bản tôi sẽ thêm, theo kiểu xen kẽ, một mục vào mỗi đầu của danh sách. Vì tôi cần phải lưu dữ liệu với SharedPreferences mà chỉ lưu các kiểu dữ liệu cơ bản, nó sẽ là khá rắc rối để theo dõi hai danh sách. – rphello101

+0

tìm thấy whati tôi đang tìm kiếm. thankx – raj

+0

Là tốt, nhưng không hoạt động khi bạn thử với các đối tượng tùy chỉnh + thẻ! – delive

3

Các ListView hiển thị dữ liệu vì nó được lưu trữ trong nguồn dữ liệu của bạn.

Khi bạn thêm cơ sở dữ liệu của mình, nó phải thêm các phần tử vào cuối. Vì vậy, khi bạn nhận được tất cả các dữ liệu thông qua đối tượng Cursor và gán nó cho ArrayAdapter, nó chỉ theo thứ tự đó. Về cơ bản, bạn nên cố gắng đưa dữ liệu vào đầu cơ sở dữ liệu, thay vào đó cuối cùng, có thể có một số dấu thời gian.

Sử dụng ArrayList, bạn có thể làm điều đó bằng cách Collections.reverse(arrayList) hoặc nếu bạn đang sử dụng SQLite, bạn có thể sử dụng order by.

+0

Không, tôi nghĩ rằng điều này là sai. Đối với listview bạn cần phải vượt qua mảng/danh sách như đầu vào. Trong cơ sở dữ liệu trừ khi bạn có dấu thời gian chèn, bạn không thể làm bất cứ điều gì. – kosa

+0

@Nambari: Tôi xin lỗi. Những gì tôi thực sự có nghĩa là để lấy dữ liệu từ cơ sở dữ liệu bằng cách sử dụng một đối tượng Cursor và sau đó đặt nó trong một ArrayAdapter. Một cái gì đó như thế này http://stackoverflow.com/questions/5717732/how-do-i-display-data-from-my-database-in-a-listview. Sẽ cập nhật câu trả lời của tôi. Cám ơn bạn đã góp ý. – Swayam

0

Bạn luôn có thể có một dấu ngày tháng trong đối tượng của bạn và sắp xếp listview của bạn dựa trên đó ..

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

tại loại danh sách của bạn

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

này nên sắp xếp danh sách của bạn sao cho mục mới nhất sẽ nằm trên đầu trang

0

Bạn luôn có thể sử dụng LinkedList thay thế và sau đó sử dụng phương thức addFirst() để thêm các phần tử vào danh sách của bạn và nó sẽ có hành vi mong muốn (các mục mới ở phía trên cùng của ListView).

14

Một giải pháp mà không sửa đổi danh sách ban đầu, ghi đè phương pháp GetItem() trong Adaptor

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

Cập nhật: Ví dụ

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

}

+1

Đây là một giải pháp rất thanh lịch. Tôi đã thực hiện một thay đổi nhỏ để tôi có thể sử dụng nó trong ArrayAdapters ẩn danh mà không để lộ các mục dữ liệu: 'return super.getItem (getCount() - 1 - position);' –

+0

Điều này làm việc nhưng khi cuộn mục đầu tiên trong danh sách có vẻ như trùng lặp với danh sách mục cuối cùng. Tôi nghĩ rằng vấn đề này đã làm với việc tái chế các mặt hàng listview (không chắc chắn). –

+0

Bạn có thể cho biết cách ghi đè phương thức getItem() trong bộ điều hợp không? – Apurva

1

mBlogList là một cái nhìn tái chế ...

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 
0

Bạn có thể thêm phần tử vào đầu danh sách: như

arraylist.add(0, object) 

thì nó sẽ luôn hiển thị phần tử mới ở trên cùng.

Các vấn đề liên quan