2012-09-28 22 views
7

में JSON से सूचीदृश्य उत्पन्न मैं पूरी तरह से Android के लिए और वर्तमान में JSON सारणी जो मेरे सर्वर से खींचा गया था से सूचीदृश्य उत्पन्न करने के लिए कोशिश कर नया हूँ, मैं कोई भाग्य के साथ ट्यूटोरियल की एक बहुत कुछ पढ़ा है, वहाँ ऐसा करने के लिए अनोखा तरीका है। क्या आप कृपया कुछ संसाधनों को शुरू करने के लिए अच्छा बता सकते हैं।एंड्रॉयड

import josecgomez.com.android.dev.webservice.objects.alerts; 

मुझे दे रही है "" कोई पहचान संसाधन के रूप में:

public class AlertsAdapter extends ArrayAdapter<alerts> 

धन्यवाद, किसी भी मदद बहुत सराहना कर रहा है

मैं this पेज तथापि मैं निम्नलिखित कोड के साथ फंस कर रहा हूँ पढ़ लिया है!

+0

आप JSON की आप दिखाए जाने वाले वस्तुओं एक का एक उदाहरण पोस्ट कर सकते हैं? साथ ही, क्या आप सूची में नाम दिखाना चाहते हैं? –

उत्तर

16

JSON & listview ll काम सेट ..

मदों की एक सूची 1.displaying

एंड्रॉइड एसडीके एंड्रॉइड.एप.लिस्टएक्टिविटी नामक सुपरक्लास का उपयोग करके डेटा की एक सूची को त्वरित रूप से प्रदर्शित करने का एक सुविधाजनक तरीका प्रदान करता है। यह गतिविधि पहले से ही एक सामग्री दृश्य प्रदान करती है, जो ListView के साथ कॉन्फ़िगर किया गया है, जो डेटा के साथ उपयोग करने और पॉप्युलेट करने के लिए तैयार है।

सूची दृश्य अब डेटा को उस पंक्ति को मानचित्रित करने के साधनों के साथ प्रदर्शित करने के लिए डेटा दिया जाना चाहिए। ListAdaptors इस तंत्र को प्रदान करते हैं और setListAdaptor का उपयोग करके ListActivity के अंतर्निहित ListView पर सेट हैं।

एक Android एसडीके एडाप्टर (ArrayAdaptor) जानता है कि कैसे ListViews में मनमाने ढंग से डेटा की सरणियों को संभालने के लिए प्रदान की (एंड्रॉयड एसडीके भी इस तरह के कर्सर एडेप्टर के रूप में कई अन्य ListAdaptors, है, जो जब एक ListView को स्थानीय डेटा भंडारण जोड़ने सहायता कर सकते हैं के साथ आता है)। आपको एडाप्टर को उस लेआउट के साथ भी प्रदान करने की आवश्यकता है जिसका उपयोग तत्वों को प्रत्येक पंक्ति पर प्रस्तुत करने के लिए किया जा सकता है। उदाहरण में हम एंड्रॉयड एसडीके प्रदान की लेआउट, simple_list_item_1 है, जो एक एकल पाठ हमारे एकल तार बिछाने के लिए लेबल-एकदम सही है का उपयोग कर रहे नीचे:

String[] elements = {"Line 1", "Line 2"}; 
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, elements)); 

प्रत्येक सूची आइटम की नज़र 2.customizing

इसे प्राप्त करने के लिए आपको इनबिल्ट लेआउट और ArrayAdaptor से आगे बढ़ना होगा और इसके बजाय अपना स्वयं का कार्यान्वयन करना होगा।

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

public class ABC { 
    String userId; 
    String pwd; 
} 

/res/layout/list_item.xml में एक प्रारूप का एक्सएमएल फ़ाइल बनाएं दो TextViews अलग-अलग पंक्तियों पर सामग्री और लेखक प्रदर्शित करने के लिए परिभाषित करने के लिए। उन्हें एक दूसरे से ऊपर प्रदर्शित करने के लिए, एक लीनरलाइट का उपयोग करें, जिसमें प्रत्येक तत्व को लंबवत (android:orientation="vertical") प्रस्तुत करने के लिए कॉन्फ़िगर किया गया है।

एक बार एक्सएमएल फ़ाइल बनाई गई है, तो एंड्रॉइड एक्लिप्स प्लगइन स्वचालित रूप से जेनरेट आर फ़ाइल में संदर्भ के रूप में जोड़ देगा। यह आर फ़ाइल आपके प्रोजेक्ट के जेन फ़ोल्डर के तहत रखी जाती है और आपके एक्सएमएल तत्वों और आपके जावा कोड के बीच एक पुल के रूप में कार्य करती है। यह आपके जावा कोड को एक्सएमएल तत्वों और/res फ़ोल्डरों के तहत बनाई गई फ़ाइलों का संदर्भ देने की अनुमति देता है। आपके द्वारा अभी बनाई गई फ़ाइल को अब जावा कोड में R.layout.list_item के रूप में संदर्भित किया जा सकता है, क्योंकि आप कस्टम सूची एडाप्टर में आगे करेंगे।

ListAdaptor नामक एक निजी वर्ग (गतिविधि के अंदर) बनाएं जो ArrayAdaptor उपclasses। इस वर्ग का उपयोग एक ऐरेलिस्ट को प्रदर्शित करने के लिए किया जाना चाहिए, साथ ही ऊपर दिए गए लेआउट में बनाए गए TextViews पर ऑब्जेक्ट्स को मैप करने का एक तरीका प्रदान करना चाहिए।

यह मैपिंग ListAdaptor को ओवरराइड करता है, और अनुरोधित स्थिति पर डेटा की सामग्री के साथ पॉप्युलेट व्यू ऑब्जेक्ट वापस करना चाहिए। जैसा कि नीचे दिखाया

private class abcListAdaptor extends ArrayAdapter<abc> { 
    private ArrayList<abc> abc; 
    public abcListAdaptor(Context context, int textViewResourceId, ArrayList<abc> items) { 
     super(context, textViewResourceId, items); 
     this.abc = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService       
(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.list_item, null); 
     } 

     abc o = abc.get(position); 
     TextView tt = (TextView) v.findViewById(R.id.uid); 
     TextView bt = (TextView) v.findViewById(R.id.pwd); 
     tt.setText(o.userid); 
     bt.setText(o.pwd); 
     return v; 
    } 
} 

अब onCreate विधि बनाया परीक्षण डाटा के साथ कस्टम सूची एडाप्टर का उपयोग करने के लिए समायोजित किया जा सकता:

कस्टम abcListAdaptor की पूरी कार्यान्वयन से नीचे है

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
abc a = new abc(); 
a.userid = "tech"; 
a.pwd = "android"; 
ArrayList<abc> items = new ArrayList<abc>(); 
items.add(a); 
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, items); 
setListAdapter(adaptor); 
} 

3. रिमोट सेवाओं और पार्सिंग डेटा को एक्सेस करना

एंड्रॉइड एसडीके में पैकेज एआईएम डी HTTP-आधारित एपीआई तक पहुंच को सरल बनाने पर डी। अपाचे HTTP कक्षाओं को शामिल किया गया है और org.apache.http package के तहत पाया जा सकता है।आप सर्वर से वापस आने वाले डेटा को पार्स करने के लिए org.json कक्षाओं के साथ इन कक्षाओं का उपयोग करेंगे।

हम उस गतिविधि में एक निजी विधि बना सकते हैं जो अनुरोध करता है, परिणाम को पार करता है, और ArrayList ऑब्जेक्ट्स देता है। नीचे सूचीबद्ध कोड अनुरोध करता है और परिणामस्वरूप JSON array देखता है, जिसे प्रत्येक पाठ और from_user तत्व निकालने के लिए पुनरावृत्त किया जाता है।

ArrayList<abc> getDetail= new ArrayList<abc>(); 
    try { 
     HttpClient hc = new DefaultHttpClient(); 
     HttpGet get = new 
     HttpGet("<a href="http://your URL"></a>"); 
     HttpResponse rp = hc.execute(get); 

     if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
      String result = EntityUtils.toString(rp.getEntity()); 
      JSONObject root = new JSONObject(result); 
      JSONArray sessions = root.getJSONArray("results"); 

      for (int i = 0; i < sessions.length(); i++) { 
       JSONObject session = sessions.getJSONObject(i); 
       abc a = new abc(); 
       a.uid = session.getString("user"); 
       a.pwd = session.getString("password"); 
       getDetail.add(a); 
      } 
     } 
    } 

    catch (Exception e) { 
     Log.e("Activity", "Error loading JSON", e); 
    } 

अब डमी डेटा आपने पहले जब onCreate विधि में कस्टम सूची एडाप्टर के निर्माण लोड विधि के लिए एक कॉल के साथ प्रयोग किया बदलें।

abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load()); 

4.creating उत्तरदायी यूजर इंटरफेस

अपनी वर्तमान स्थिति में कोड प्रतिसाद नहीं (ANR) संवाद, प्रकट करने के लिए उपयोगकर्ता ने आपके ऐप छोड़ने की उत्साह एक आवेदन पैदा करने के लिए क्षमता है। यह onCreate जैसी विधियों के भीतर किए जा रहे डेटा के लिए दूरस्थ अनुरोध करने के लंबे समय तक चलने वाले काम के कारण हो सकता है।

लंबे समय से चल कार्यों मुख्य आवेदन धागा (जो यूजर इंटरफेस घटना पाश ड्राइव) पर कभी नहीं किया जाना चाहिए। उन्हें काम करने के लिए बच्चों के धागे में फेंक दिया जाना चाहिए।

जबकि जावा के Thread कक्षा का उपयोग इस कार्य के लिए किया जा सकता है, इसमें एक जटिलता है कि लंबे समय तक चलने वाला कार्य पूरा होने के बाद, आमतौर पर परिणाम की रिपोर्ट करने के लिए उपयोगकर्ता इंटरफ़ेस को बदलना चाहता है (यानी, एक सूची प्रदर्शित करें अनुरोध से भरा हुआ)।

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

शुक्र है, एंड्रॉइड एसडीके एक सुविधाजनक श्रेणी AsyncTask प्रदान करता है, जो यूआई थ्रेड के साथ सुरक्षित रूप से बातचीत करने के लिए एसिंक्रोनस कार्यों के लिए एक आसान तंत्र प्रदान करता है। यह AsyncTask को उप-वर्गीकृत करके और लंबे समय तक चलने वाले कार्य करने के लिए doInBackground विधि को ओवरराइड करके प्राप्त किया जाता है, फिर UI पर किसी भी कुशलता को करने के लिए PostExecute पर ओवरराइड किया जाता है।

जब AsyncTask बनाया गया है (इसे यूआई थ्रेड पर बनाया जाना है) और निष्पादित किया गया है, तो पृष्ठभूमि थ्रेड पर doInBackground विधि लागू की जाती है। पूरा होने पर, onPostExecute विधि को मुख्य UI थ्रेड पर वापस बुलाया जाता है।

अपने ऐप्लिकेशन में इस का उपयोग करने के लिए आपको MyTask बुलाया गतिविधि (कस्टम एडाप्टर वर्ग की तरह) है, जो AsyncTask उपवर्गों के भीतर एक निजी वर्ग को लागू करने की आवश्यकता होगी। आप अपनी पिछली लोड विधि की सामग्री के साथ doInBackground विधि को ओवरराइड कर सकते हैं।

बजाय ArrayList लौटाए जाने, आप गतिविधि में एक उदाहरण चर ताकि डेटा निजी वर्गों में साझा किया जा सकता बनाए रखें। फिर onPostExecute में आप डेटा एडाप्टर को डेटा के साथ सेट कर सकते हैं, जैसा कि पहले क्रिएट में किया गया था। ऑनक्रेट विधि अब माई टास्क ऑब्जेक्ट बनाता है और निष्पादन विधि को कॉल करता है।

बेस्ट साइटेंListView के लिए this & this हैं।

-

सादर

TechEnd

4

आप एक नया वस्तु आपके द्वारा निर्मित में अपने JSON ऑब्जेक्ट के महत्वपूर्ण तत्व स्टोर करने के लिए की जरूरत है।

मान लें कि आपका JSON ऑब्जेक्ट आप नाम, तारीख और फोन नंबर के साथ कुंजी देता है की सुविधा देता है, तो आप एक उद्देश्य यह है कि जानकारी के उस तरह होता है की जरूरत है।

अपने सूचीदृश्य अपने नए प्रकार का एक arrayadapter ले जाएगा, सूचीदृश्य की प्रत्येक कोशिका (जैसे textviews के रूप में) UI तत्व है कि आपके वस्तु की जानकारी के साथ भर जाते हैं शामिल होंगे

यह एक 3 कदम प्रक्रिया में कम से कम है , और आप उन चरणों में से प्रत्येक के लिए समाधान से निपटने की जरूरत है व्यक्तिगत रूप से

0

मैं सुझाव है कि आप इन चरणों का पालन:

  1. वेब से डेटा प्राप्त करें और यह स्टोर
  2. stor दर्रा एक एडाप्टर
  3. अपनी सूची

को एडाप्टर सेट पहले चरण में करने के लिए डेटा एड, मैं तुम्हें AsyncTask वर्ग है, जो पृष्ठभूमि कार्रवाई करने और बिना यूआई धागे पर परिणाम प्रकाशित करने की अनुमति का उपयोग कर डेटा प्राप्त करने का सुझाव धागे और/या हैंडलर में हेरफेर करने के लिए। दूसरा, आपको जेएसओएन संरचना के अनुसार अपनी सामग्री को पार्स करना होगा। अंत में, अपनी सूची को पॉप्युलेट करने के लिए अपने डेटा को एडाप्टर में पास करें।

1

मैं विषय पर एक अच्छा resource मिल गया है। अब मेरे पास जेसन डेटा के साथ मेरी सूची है। सभी नौसिखियों की अत्यधिक सिफारिश की गई। मदद के लिए धन्यवाद दोस्तों।

+1

मुझे कोई कारण नहीं दिख रहा है कि अश्विनी का उत्तर ऊपर क्यों काम नहीं करेगा। यह इतना सरल है। – Nitin

+3

आपको बहुत ही योग्य उत्तर मिल गए हैं ताकि आप सही उत्तर के रूप में अपना उत्तर चुन सकें ... – dorjeduck

3

अपनी गतिविधि में इस कोड की कोशिश पहले स्ट्रिंग सरणी में json डेटा पार्स और फिर एडाप्टर अपने सूची दृश्य shoul एक्सएमएल में अपनी गतिविधि के इस तरह

try 
    { 

    JSONArray jArray = new JSONArray(result); 
    JSONObject jObj=new JSONObject(); 
    String[] data=new String[jArray.length()] 

     for(int i=0;i<jArray.length();i++) 
     { 
      jObj= jArray.getJSONObject(i); 
      data[i]=json_data.getString("value"); 

     } 

     GameAdapter adapter = new GameAdapter(this, R.layout.listview_item_row, data); 
     listView1 = (ListView)findViewById(R.id.listView1); 
     listView1.setAdapter(adapter); 
} 
catch(Exception e) 
{ 
} 
+0

यदि यह कोड आपकी सहायता नहीं करता है तो मैं इसके लिए पूरा कोड पोस्ट करूंगा, कृपया मुझे बताएं कि आपकी समस्या हल नहीं हुई है –