2012-10-08 18 views
11

जैसा कि मैंने पहले से पूछे गए प्रश्नों पर देखा है, कस्टम एडाप्टर क्लास (कहें, MyAdapter ArrayAdapter को बढ़ाता है) वे हमेशा एक फुले हुए XML सूची-आइटम लेआउट का उपयोग करते हैं । मुझे क्या करना आशा करता हूं MyAdapter के लिए सब कुछ पूरी तरह से जावा और कोई XML का उपयोग ...एंड्रॉइड में प्रोग्रामेटिक रूप से कस्टम सूची आइटमों के साथ एक सूची दृश्य बनाना - कोई XML सूची आइटम लेआउट

// for example 
String[] wordlist = new String[] {a, b, c}; 

LinearLayout list_item_layout = new LinearLayout(this); 
list_item_layout.setId(5000); 

TextView listText = new TextView(this); 
listText.setId(5001); 

listLayout.addView(listText); 

ListView list = new ListView(this); 

// ** QUESTION ** do I declare a programmatic .setAdapter() like this? 
// ** TAKE NOTE ** I passed 'wordlist' here.. 
list.setAdapter(new MyAdapter(this, list_item_layout.getId(), listText.getId(), wordlist)); 

और फिर बनाने के है ...

private class MyAdapter extends ArrayAdapter<String> { 

    public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) { 
     super(context, resource, textViewResourceId, strings); 
    } 

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

     View v = convertView; //is this the list_item_layout that I passed?? 
     TextView tv = (TextView) v.findViewById(5001); 

     // ** QUESTION ** do I pass 'wordlist' again here? 
     tv.setText(wordlist[position]); 

     return v; 
    } 
} 

जब मैं अपने डिवाइस पर इस जाए तो क्या होता रहा है निम्नलिखित त्रुटियां प्राप्त करें ...

10-08 23:11:19.775: E/AndroidRuntime(18276): FATAL EXCEPTION: main 
    10-08 23:11:19.775: E/AndroidRuntime(18276): android.content.res.Resources$NotFoundException: String resource ID #0x0 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.content.res.Resources.getText(Resources.java:222) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.widget.TextView.setText(TextView.java:3011) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at com.turista.client.TuristaClientMain.onClick(TuristaClientMain.java:113) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.view.View.performClick(View.java:2538) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.view.View$PerformClick.run(View.java:9152) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Handler.handleCallback(Handler.java:587) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Handler.dispatchMessage(Handler.java:92) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.os.Looper.loop(Looper.java:123) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at android.app.ActivityThread.main(ActivityThread.java:3691) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at java.lang.reflect.Method.invokeNative(Native Method) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at java.lang.reflect.Method.invoke(Method.java:507) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
    10-08 23:11:19.775: E/AndroidRuntime(18276): at dalvik.system.NativeStart.main(Native Method) 

क्या कोई इस प्रोग्रामेटिक तरीके से कैसे कार्य कर सकता है?


* संपादित * अक्टूबर 9, 2012


ठीक है, के रूप में मैं अभी भी इस समस्या में फंस कर रहा हूँ मुझे लगता है कि मैं कुछ सुधार किए हैं, लेकिन अभी भी त्रुटि संदेश मिलता है। बेहतर कोड इस प्रकार है ..

//wordlist is a global variable 
String[] wordlist = new String[] {a, b, c}; 

// .. 
// .. inside onCreate... 

ListView list = new ListView(this); 
     list.setAdapter(new MyAdapter(this, R.layout.listitem, R.id.mLargeTextView, wordlist)); 
// since the ArrayAdapter class needs XML parameters to inflate, I created a dummy layout 
अब MyAdapter वर्ग के अंदर

..

private class MyAdapter extends ArrayAdapter<String> { 

    public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) { 
     super(context, resource, textViewResourceId, strings); 
    } 

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


     LinearLayout listLayout = new LinearLayout(Main.this); 
     listLayout.setLayoutParams(new LayoutParams(wrapContent, wrapContent)); 
     listLayout.setId(5000); 

     TextView listText = new TextView(Main.this); 
     listText.setId(5001); 

     listLayout.addView(listText); 

     listText.setText(wordlist[position]); 

     return listLayout; 
    } 
} 

आप देख सकते हैं, मुझे लगता है मैं तो यह है getView क्रम में ओवरराइड करने के लिए अपने कस्टम दृश्य प्रदर्शित करने के लिए है मैंने क्या किया। दुर्भाग्य से मुझे लगता है कि मैंने इसे गलत समझा। यहाँ त्रुटियाँ हैं ..

10-09 09:24:10.095: E/AndroidRuntime(2517): FATAL EXCEPTION: main 
    10-09 09:24:10.095: E/AndroidRuntime(2517): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.ListView.measureScrapChild(ListView.java:1183) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1266) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.ListView.onMeasure(ListView.java:1175) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.View.measure(View.java:8366) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewRoot.performTraversals(ViewRoot.java:847) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1868) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.os.Looper.loop(Looper.java:123) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at android.app.ActivityThread.main(ActivityThread.java:3691) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at java.lang.reflect.Method.invokeNative(Native Method) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at java.lang.reflect.Method.invoke(Method.java:507) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
    10-09 09:24:10.095: E/AndroidRuntime(2517):  at dalvik.system.NativeStart.main(Native Method) 
+0

मैं पूछ सकता हूँ तुम क्यों के बजाय XML का उपयोग इस कार्यक्रम संबंधी शैली करना चाहते हैं? – Zerkz

+0

आपने पहले से ही आईडी सेट की है कि आप उस आईडी के साथ नया टेक्स्ट व्यू क्यों ढूंढ रहे हैं? tv.getID() का प्रयोग करें। –

+0

@ कुमार आपका क्या मतलब है? मैंने v.findViewById (5001) का उपयोग किया। – daryl

उत्तर

21

ListView फैली AbsListView जो बारी में AdapterView जो दिखाई देने वाले समूह फैली फैली हुई है। तो ListView के सभी बच्चे को ViewGroup में जोड़ा जाएगा। तो लेआउट पैरामीटर सेट करने के लिए, listLayout के लिए लेआउट पैरामीटर सेट करते समय आप ViewGroup.LayoutParam का उपयोग कर सकते हैं।

या के लिए listLayout

कृपया इसे कोशिश करते हैं और मुझे पता है अगर यह काम करते हैं लेआउट परम स्थापित करने के लिए AbsListView.LayoutParams प्रयास करें।

के बाद कोड ठीक काम कर रहा है ..

public class MainActivity1 extends Activity { 

    String[] wordlist = new String[] { "a", "b", "c" }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ListView list = new ListView(this); 
     list.setAdapter(new MyAdapter(this, wordlist)); 

     setContentView(list); 
    } 

    private class MyAdapter extends ArrayAdapter<String> { 

     public MyAdapter(Context context, String[] strings) { 
      super(context, -1, -1, strings); 
     } 

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

      LinearLayout listLayout = new LinearLayout(MainActivity1.this); 
      listLayout.setLayoutParams(new AbsListView.LayoutParams(
        AbsListView.LayoutParams.WRAP_CONTENT, 
        AbsListView.LayoutParams.WRAP_CONTENT)); 
      listLayout.setId(5000); 

      TextView listText = new TextView(MainActivity1.this); 
      listText.setId(5001); 

      listLayout.addView(listText); 

     listText.setText(super.getItem(position)); 

      return listLayout; 
     } 
    } 
} 

समस्या यह है कि डिफ़ॉल्ट ग्रहण आयात ViewGroup.LayoutParams द्वारा जो AbsListView.LayoutParams जो दृश्य के लिए लेआउट परम स्थापित करने के लिए इस्तेमाल किया जा करने की जरूरत है getView() विधि से लौटे के साथ असंगत हैं था।

कृपया जाँच करें और मुझे पता है कि यह कैसे चला गया जाने ..

+0

बस इसे AbsListView.LayoutParams के साथ परीक्षण किया और यह ठीक काम कर रहा है। तदनुसार मेरा जवाब अपडेट किया गया .. –

+0

वाह यह काम करता है। मुझे नहीं पता था कि इस getView() विधि में लेआउट पैराम्स को अलग-अलग संभाला जाता है, और ग्रहण द्वारा किए गए ऑटो-आयात पर भारी निर्भरता अच्छी बात नहीं है। – daryl

+0

धन्यवाद। मैं लगभग इस विचार को प्रोग्रामेटिक रूप से सबकुछ करने के लिए छोड़ रहा था। एक आखिरी सवाल, मैं देख सकता हूं कि आपने सेट एडाप्टर (नया MyAdapter()) के अंदर सरणी 'वर्डलिस्ट' को पार किया है। तो इसका मतलब है कि यह पहले से ही MyAdapter के अंदर होना चाहिए ... यदि 'वर्डलिस्ट' वैश्विक स्तर पर घोषित नहीं किया गया है, तो आप इसे कैसे कहते हैं? फिर से धन्यवाद प्रफुल। तुमने इसे पूरी तरह से खींचा। – daryl

2

ऊपर जवाब देने के लिए जोड़ने के लिए, एक निरंतर संख्या के साथ आईडी की स्थापना एक अच्छा विचार नहीं है।

बदलें, साथ listLayout.setId(5000);, listLayout.setId(View.generateViewId());

मामले में आप एपीआई 16 को लक्षित और नीचे कर रहे हैं, का उल्लेख this.