2012-08-31 25 views
10

के शीर्ष पर नई आइटम प्रदर्शित करें I ListView() को पॉप्युलेट करने के लिए एक सूची का उपयोग कर रहा हूं। उपयोगकर्ता सूची में आइटम जोड़ने में सक्षम है। हालांकि, मुझे ListView के शीर्ष पर प्रदर्शित होने वाली वस्तुओं की आवश्यकता है। रिवर्स ऑर्डर में इसे प्रदर्शित करने के लिए मैं अपनी सूची की शुरुआत में कोई आइटम कैसे डालूं?ListView

+0

डेटा का स्रोत क्या है? यदि आप इसे डेटाबेस से पढ़ रहे हैं, तो आप ऑर्डर द्वारा 'ऑर्डर बाय' या समकक्ष के साथ ऑर्डर को हमेशा बदल सकते हैं। – MrLore

उत्तर

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); 
+0

मैंने अपनी सूची को तोड़ दिया और सुस्त रूप से एडाप्टर का इस्तेमाल किया। महान काम किया! धन्यवाद। – rphello101

+0

आपका स्वागत है! – aymeric

20

डिफ़ॉल्ट सूची से नीचे तत्व जोड़ता है। यही कारण है कि आपके द्वारा जोड़े गए सभी नए तत्व नीचे दिखाए जाएंगे।

Collections.reverse(yourList); 
+0

अच्छा विचार है, लेकिन मैंने सूची में आइटम जोड़ना जारी रखा और इसे उलट दिया, मैं अनिवार्य रूप से एक वैकल्पिक फैशन में, सूची के प्रत्येक छोर पर एक आइटम जोड़ रहा था। चूंकि मुझे साझा किए गए डेटा के साथ डेटा को सहेजने की आवश्यकता है जो केवल मूल डेटा प्रकारों को सहेजता है, इसलिए दो सूचियों का ट्रैक रखने में काफी परेशानी होगी। – rphello101

+0

मिला जो मैं खोज रहा था। धन्यवाद – raj

+0

अच्छा है, लेकिन जब आप कस्टम + टैग ऑब्जेक्ट्स के साथ प्रयास करते हैं तो काम नहीं करते! – delive

3

ListView डेटा प्रदर्शित करता है के रूप में यह अपने डेटा स्रोत में संग्रहीत है: आप उलटे क्रम में यह चाहते हैं, listadapter/दृश्य पर की तरह सूची

कुछ की स्थापना रिवर्स से पहले हो सकता है।

जब आप अपने डेटाबेस में जोड़ रहे हैं, तो यह अंत में तत्व जोड़ना होगा। इसलिए, जब आप कर्सर ऑब्जेक्ट के माध्यम से सभी डेटा प्राप्त कर रहे हैं और इसे ऐरेएडाप्टर को असाइन कर रहे हैं, तो यह केवल उस क्रम में है। आपको मूल रूप से डेटाबेस की शुरुआत में डेटा डालने की कोशिश करनी चाहिए, बल्कि अंत में, कुछ समय-स्टैम्प होकर।

ArrayList का उपयोग करना, आप इसे Collections.reverse(arrayList) द्वारा करते हैं या यदि आप SQLite उपयोग कर रहे हैं, तो आप order by उपयोग कर सकते हैं कर सकते हैं।

+0

नहीं, मुझे नहीं लगता कि यह गलत है। सूचीदृश्य के लिए आपको इनपुट के रूप में सरणी/सूची पास करने की आवश्यकता है। डेटाबेस में जब तक आपके पास सम्मिलन का टाइमस्टैम्प नहीं है, आप कुछ भी नहीं कर सकते हैं। – kosa

+0

@ नंबारी: मुझे खेद है। वास्तव में मेरा मतलब यह था कि कर्सर ऑब्जेक्ट का उपयोग कर डेटाबेस से डेटा पुनर्प्राप्त करने के लिए और फिर इसे ऐरेएडाप्टर में डालें। इस तरह कुछ http://stackoverflow.com/questions/5717732/how-do-i-display-data-from-my-database-in-a-listview। मेरा जवाब अपडेट करेगा। आपके कमेंट के लिए धन्यवाद। – Swayam

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

यह अपनी सूची को सॉर्ट करना चाहिए जैसे कि नवीनतम आइटम शीर्ष पर जाएगा

0

आप हमेशा इसके बजाय एक लिंक्डलिस्ट का उपयोग कर सकते हैं और फिर अपनी सूची में तत्व जोड़ने के लिए addFirst() विधि का उपयोग कर सकते हैं और इसमें वांछित व्यवहार (ListView के शीर्ष पर नई आइटम) होगी।

14

मूल सूची को संशोधित किए बिना एक अन्य समाधान, एडाप्टर

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

अपडेट किया गया में ओवरराइड GetItem() विधि: उदाहरण

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

यह एक बहुत ही सुरुचिपूर्ण समाधान है। मैंने मामूली परिवर्तन किया है, इसलिए मैं इसे अज्ञात ArrayAdapters में उपयोग कर सकता हूं जो डेटा आइटम्स का पर्दाफाश नहीं करता है: 'super.getItem (getCount() - 1 - स्थिति) लौटें;' –

+0

यह काम करता है लेकिन सूची में पहले आइटम को स्क्रॉल करते समय आखिरी आइटम सूची में डुप्लिकेट की तरह लगता है। मुझे लगता है कि इस समस्या को सूचीदृश्य वस्तुओं के रीसाइक्लिंग के साथ करना है (सुनिश्चित नहीं)। –

+0

क्या आप कृपया बता सकते हैं कि एडाप्टर में getItem() विधि को ओवरराइड कैसे करें? – Apurva

1

mBlogList एक recycler दृश्य है ...

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

आप सूची की शुरुआत में तत्व जोड़ सकते हैं: जैसे

arraylist.add(0, object) 

तो यह हमेशा शीर्ष पर नए तत्व को प्रदर्शित करेगा।