2012-08-31 17 views
10

ListView() öğesini doldurmak için bir liste kullanıyorum. Kullanıcı listeye öğe ekleyebilir. Bununla birlikte, ListView'in en üstünde görüntülenecek öğelere ihtiyacım var. Ters sırada görüntülemek için listemin başına bir öğe nasıl ekleyebilirim?ListView'ün en üstündeki yeni öğeleri gösterme ListView

+0

Verilerin kaynağı nedir? Bir veritabanından okuyorsanız, her zaman sorgunun döndürdüğü sıralamayı "order by" veya eşdeğeriyle değiştirebilirsiniz. – MrLore

cevap

10

Muhtemelen bir ArrayAdapter kullanmalı ve insert(T, int) yöntemini kullanmalısınız.

Ör:

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

Sadece listemi kazıttım ve adaptörünü sıkıca kullandım. Harika çalıştı! Teşekkürler. – rphello101

+0

Rica ederim! – aymeric

20

Varsayılan olarak, alt kısımdaki öğeleri ekler. Bu yüzden eklediğiniz tüm yeni öğeler altta görünecektir. sizin veri kaynağında depolanan olarak ListView verileri görüntüler

Collections.reverse(yourList); 
+0

İyi fikir, ancak listeye öğeler eklemeye devam ettim ve bunu geri almayı sürdürdüm, listenin her bir ucuna alternatif olarak bir öğe ekliyorum. Verileri yalnızca temel veri türlerini kaydeden SharedPreferences ile kaydetmem gerektiğinden, iki listeyi takip etmek oldukça zor olurdu. – rphello101

+0

aradığım şeyi buldum. thankx – raj

+0

İyi, ama nesnelerle özel + etiketleri denediğinizde işe yaramıyor! – delive

3

: Eğer ters sırada bunu istiyorsanız, gibi listesine listadapter/görünümüne

şey ters ayarlamadan önce olabilir.

Veritabanınıza eklediğinizde, öğelerin sonuna eklenmesi gerekir. Dolayısıyla, tüm verileri İmleç nesnesi üzerinden aldığınızda ve ArrayAdapter öğesine atadığınızda, yalnızca bu sıradadır. Temelde veri tabanının başlangıcına veri yazmayı denemelisiniz, bunun yerine sonunda bir zaman damgası alarak.

ArrayList kullanarak, SQLite veya kullanılıyorsa, sen order by kullanabilirsiniz Collections.reverse(arrayList) ile yapabilirsiniz.

+0

Hayır Bu yanlış olduğunu düşünüyorum. Liste görünümü için dizi/liste girişi olarak geçmeniz gerekir. Ekleme zaman damgası olmadıkça, veritabanında hiçbir şey yapamazsınız. – kosa

+0

@Nambari: Üzgünüm. Aslında kastedilen, bir Cursor nesnesi kullanarak veri tabanından veriyi almak ve ArrayAdapter'e koymaktı. Bu http://stackoverflow.com/questions/5717732/how-do-i-display-data-from-my-database-in-a-listview gibi bir şey. Cevabımı günceller. Yorumun için teşekkürler. – Swayam

0

Her zaman nesneleri bir datestamp varsa ve listview o dayalı sıralamak ..

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

şimdi sıralamak liste

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

Bu Listenizi en yeni öğe

'a gidecek şekilde sıralamalıdır
0

Bunun yerine bir LinkedList kullanabilirsiniz ve listenize eleman eklemek için addFirst() yöntemini kullanın ve istenen davranışa sahip olacaktır (ListView'ün en üstündeki yeni öğeler).

14

orijinal listeyi değiştirmeden Başka bir çözüm, Güncelleme Adaptör

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

içinde getItem() yöntemini geçersiz: Örnek

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

Bu çok zarif bir çözümdür. Küçük bir değişiklik yaptım, böylece veri maddelerini göstermeyen anonim ArrayAdapter'larda kullanabildim: 'return super.getItem (getCount() - 1 - konum)' ' –

+0

Bu, ancak listedeki ilk öğeyi kaydırırken çalışır son öğe listesine bir kopyası gibi görünüyor. Bence bu sorun, listview öğelerinin geri dönüşümü ile ilgili (emin değil). –

+0

Adaptördeki getItem() yöntemini nasıl geçersiz kılacağınızı söyleyebilir misiniz? – Apurva

1

mBlogList bir geri dönüşüm görünüşüdür ...

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

Listenin başındaki eleman ekleyebilirsiniz:

arraylist.add(0, object) 

gibi sonra herzaman üstünde yeni bir unsur gösterecektir.