2011-06-13 14 views
6

सीखने के उद्देश्यों के लिए मैं एक एंड्रॉइड एप्लिकेशन लिखना चाहता हूं जो 0 से Integer.MAX_VALUE तक की संख्या प्रदर्शित करेगा। मेरे पास वर्तमान में ऐप है जो 0 से 100 तक की संख्या प्रदर्शित करेगा, यह आसान है क्योंकि आप केवल संख्याओं की एक सरणी बना सकते हैं और फिर एडाप्टर को पास कर सकते हैं, वर्तमान में ArrayAdapter का उपयोग कर सकते हैं। यदि मैं इसे एक बहुत बड़ी सरणी के साथ आज़माता हूं तो प्रोग्राम क्रैश करता है जब यह सभी उपलब्ध स्मृति का उपयोग करता है।एंड्रॉइड में ArrayAdapter और ListView के साथ बड़े डेटासेट

अधिक उन्नत अनुप्रयोगों को देखते हुए मैंने देखा कि बड़े डेटा वाले लोग डेटाबेस और कर्सर एडाप्टर का उपयोग करते हैं। यदि यह करने के लिए सही बात है तो मैं उस पर पढ़ना शुरू कर सकता हूं। मैं क्या करना चाहूंगा (हालांकि मुझे यह बताने में संकोच न करें) यह गलत है 100 लंबाई की सरणी के साथ मेरा ऐरेएडाप्टर बीज है, या कुछ अपेक्षाकृत छोटी लंबाई है। वहां से उपयोगकर्ता ऊपर या नीचे स्क्रॉल करता है, मैं को सरणी (या एडाप्टर) में मानों को संशोधित करने के लिए उपयोगकर्ता स्क्रॉल डाउन करने के लिए, सूची में सबसे छोटी वस्तुओं को हटाने और बड़े मूल्यों को अंत में जोड़ने के लिए चाहता हूं सूचि। यदि उपयोगकर्ता स्क्रॉल करता है, तो मैं सूची के अंत से आइटम को हटाना चाहता हूं और शुरुआत में नए छोटे मान जोड़ना चाहता हूं।

जैसा कि मैंने इस परियोजना के लिए कहा है, मैंने अब तक बहुत कम किया है।

package example.VariableListView; 

import java.util.ArrayList; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 

public class variablelistview extends ListActivity {  
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

      ArrayList<Integer> intItems = new ArrayList<Integer>(); 
      for (int ii = 0; ii < 100; ii++) { 
        intItems.add(ii); 
      } 
     this.setListAdapter(new ArrayAdapter<Integer>(this, 
          android.R.layout.simple_list_item_1, intItems)); 
    } 

} किसी भी और सभी मदद के लिए

धन्यवाद।

उत्तर

8

आपके द्वारा उपयोग किए जाने वाले एडाप्टर का प्रकार उस डेटा के प्रकार पर निर्भर होना चाहिए जो आप प्रस्तुत करने का प्रयास कर रहे हैं। एडेप्टर आदर्श रूप से एक बहुत ही पतली वस्तु है जो आपके डेटा सेट से आइटम को दृश्यों से जोड़ती है। ArrayAdapter इसे छोटे बाध्य डेटा सेट के लिए प्रदान करता है, CursorAdapter यह SQLite क्वेरी से उत्पन्न डेटा सेट के लिए प्रदान करता है।

सभी डेटा सेट एंड्रॉइड फ्रेमवर्क में प्रदत्त एडाप्टर कक्षाओं द्वारा प्रस्तुत किए गए मोल्ड में फिट नहीं होंगे, लेकिन अपना खुद का लेखन आसान है। सभी सकारात्मक पूर्णांक की एक सूची प्रस्तुत करना एक अच्छा उदाहरण है क्योंकि इसे अंतर्निहित डेटा मॉडल के साथ संवाद करने की आवश्यकता नहीं है। एक बड़े डेटा सेट में एक स्लाइडिंग विंडो को बनाए रखने के दौरान कुछ डेटा के लिए एक उपयोगी दृष्टिकोण हो सकता है, इसकी आवश्यकता नहीं है।

BaseAdapter से प्रारंभ:

this.setListAdapter(new IntRangeAdapter(this, 
     android.R.layout.simple_list_item_1)); 

हैं:

public class IntRangeAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 
    private int mItemResource; 

    public IntRangeAdapter(Context context, int itemLayout) { 
     // We'll use this to generate new item layouts 
     mInflater = LayoutInflater.from(context); 

     // This is the layout resource we'll use for each item 
     mItemResource = itemLayout; 
    } 

    public int getCount() { 
     // Since this adapter presents all positive integers, 
     // we have Integer.MAX_VALUE items. 
     return Integer.MAX_VALUE; 
    } 

    public Object getItem(int position) { 
     // Each item is simply its position index. 
     return position; 
    } 

    public long getItemId(int position) { 
     // Our items won't change and we don't need stable IDs, 
     // so the position of an item is also its ID. 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      // Inflate a new item layout if we weren't given an existing 
      // one to reuse via the convertView parameter. 
      convertView = mInflater.inflate(mItemResource, parent, false); 
     } 

     // Find the TextView where we will label the item. 
     // (This can be optimized a bit for more complex layouts 
     // but we won't bother for this example.) 
     TextView tv = (TextView) convertView.findViewById(android.R.id.text1); 

     // Set the item text based on its position. 
     tv.setText("Item " + position); 

     return convertView; 
    } 
} 

आपके द्वारा प्रेषित अभ्यास कोड से इसका इस्तेमाल करते हुए फिर अपने setAdapter कॉल बदल रहा है और डेटा स्थापित करने के लिए लूप को दूर करने की बात होगी आप ListViews का उपयोग करने के बारे में कुछ और जानकारी चाहते हैं, Google I/O 2010 से यह बात एक सभ्य परिचय प्रदान करती है: http://www.youtube.com/watch?v=wDBM6wVEO70

+0

ऐसे डिटा के लिए धन्यवाद iled और उत्कृष्ट उत्तर और उदाहरण – user442585

1

संभवतः सबसे आसान समाधान है कि आप अपने स्वयं के Adapter (http://developer.android.com/reference/android/widget/Adapter.html) को कर्सर एडाप्टर या ऐरेएडाप्टर को कुछ ऐसा करने के लिए मजबूर करने की कोशिश करने के बजाय कार्यान्वित करना है, जिसके लिए इसे डिज़ाइन नहीं किया गया है।

विधियों को लागू करने के लिए बहुत आसान होना चाहिए। उदाहरण के लिए:

int getCount() => Integer.MAX_VALUE 
Object getItem(int position) => position 
संबंधित मुद्दे