7

में लेआउटइनफ्लेटर का उपयोग करने में असमर्थ मैं प्रति पंक्ति 3 टेक्स्टव्यू के साथ एक सूचीदृश्य पॉप्युलेट करने के लिए एक कस्टम एडाप्टर लिखने में देख रहा हूं। मुझे ऐसा करने के लिए बहुत कुछ उदाहरण कोड मिला है, लेकिन सबसे अच्छा लग रहा था: http://www.anddev.org/custom_widget_adapters-t1796.htmlकस्टम एडाप्टर

नवीनतम एंड्रॉइड एसडीके के साथ कुछ कंपाइलर समस्याओं को ठीक करने के लिए कुछ मामूली बदलावों के बाद, मुझे यह चल रहा था, एकमात्र अपवाद प्राप्त करने के लिए:

त्रुटि/AndroidRuntime (281): java.lang.UnsupportedOperationException: addView (देखें, LayoutParams) AdapterView में समर्थित नहीं है

तो मैं अनुसंधान के एक बहुत कुछ किया है और इसके लिए कई संभावित कारण और फिक्सेस मिले। इनमें से कोई भी चीज़ बदल नहीं गई। मेरे एडाप्टर कोड वर्तमान में है:

public class WeatherAdapter extends BaseAdapter { 

    private Context context; 
    private List<Weather> weatherList; 

    public WeatherAdapter(Context context, int rowResID, 
         List<Weather> weatherList) { 
     this.context = context; 
     this.weatherList = weatherList; 
    } 

    public int getCount() {       
     return weatherList.size(); 
    } 

    public Object getItem(int position) {  
     return weatherList.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     Weather weather = weatherList.get(position); 

     //LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     LayoutInflater inflater = LayoutInflater.from(context); 

     View v = inflater.inflate(R.layout.weather_row, null, true); 
     TextView cityControl = (TextView)v.findViewById(R.id.city); 
     TextView temperatureControl = (TextView)v.findViewById(R.id.temperature); 
     ImageView skyControl = (ImageView)v.findViewById(R.id.sky); 
     return v; 
    } 

} 

तो मैं inflater होने का रास्ता बाहर टिप्पणी की कोशिश की है, और वर्तमान में बाहर uncommented। मैंने "पैरेंट" को फुर्ती करने के साथ-साथ शून्य, और "सत्य", "झूठा" गुजरने और पूरी तरह से अंतिम पैरामीटर को छोड़ने का प्रयास किया है। उनमें से कोई भी काम नहीं कर पाया है, और अब तक जो भी उदाहरण मिले हैं, वे 2008 से हैं जो मुझे लगता है कि भावना थोड़ी पुरानी है।

यदि कोई इससे मदद कर सकता है तो मुझे इस मुद्दे को हल करना अच्छा लगेगा।

उत्तर

6

मैं एक नौसिखिया भी हूं इसलिए इस जवाब को नमक के चुटकी से लें - अगर यह काम नहीं करता है, तो आगे बढ़ें और Google कुछ और करें। AdapterView से परिचित नहीं है क्योंकि पारंपरिक रूप से ListView या GridView है और एक कस्टम एडाप्टर BaseAdapter और फिर listView.setAdapter(myCustomAdapter) से बढ़ाया गया है।

आप WeatherAdapter वर्ग के अंदर कुछ इस तरह कर रही कोशिश कर सकते:

weatherAdapter.addToList(weatherToAdd); 
weatherAdapter.notifyDataSetChanged(); 

इसके अलावा, आप getView विधि में इसे और अधिक अनुकूलन करने के लिए की जरूरत है: वर्ग कि WeatherAdapter कॉल में फिर

public void addToList(Weather mWeather) { 
    weatherList.add(mWeather); 
} 

:

http://www.youtube.com/watch?v=wDBM6wVEO70

3

AdaptertView addView विधि के लिए:।

शून्य addView (देखें बच्चा)

इस विधि समर्थित नहीं है और फेंकता एक UnsupportedOperationException जब कहा जाता है "(Android दस्तावेज़ से)

शायद inflating प्रक्रिया addView विधि को कॉल करती है और यह AdapterView, या इसके AdapterView से संभव नहीं है।

प्रलेखन से:

"एक एडाप्टर वस्तु एक AdapterView और उस दृश्य के लिए अंतर्निहित डेटा के बीच एक पुल के रूप में कार्य करता है। एडाप्टर डेटा आइटम तक पहुंच प्रदान करता है। एडाप्टर भी डेटा सेट "में प्रत्येक आइटम के लिए एक दृश्य लेने के लिए जिम्मेदार है।

मुझे लगता है कि चढ़ा आपरेशन एक सरल गतिविधि से किया जा सकता है कि मॉडल उदाहरण के लिए आपके विचार और सभी अन्य कार्यों, ।, डेटा पुन: प्राप्त और अन्य वर्गों में डेटा दिखाने

आशा है कि यह उपयोगी होगा

16

मेरा मानना ​​है कि इस लाइन की गलती है:

View v = inflater.inflate(R.layout.weather_row, null, true); 
,210

इसके बजाय आप की जरूरत है:

View v = inflater.inflate(R.layout.weather_row, parent, false); 

झूठी माता पिता, इसे से जुड़ी नहीं है, जो बहुत अजीब तरह से AdapterView रों भीतर कस्टम दृश्य के लिए स्वीकार किए जाते हैं डिजाइन प्रतीत हो रहा है की फुलाया दृश्य स्वतंत्र बनाता है। ऐसा क्यों है, मुझे पूरी तरह से परेशान लगता है, लेकिन उपरोक्त पैटर्न मेरे लिए काम करता है।

+2

'एडाप्टर व्यू' का उपयोग करते समय आप अपने विचार माता-पिता से स्वतंत्र होना चाहते हैं, 'getView()' आपके लिए अभिभावक को अटैचमेंट करने का ख्याल रखता है। –

+0

@AustynMahoney मैं नहीं कहूंगा कि 'getView()' इसका ख्याल रखता है क्योंकि ** आप ** इसे लिख रहे हैं, मैं कहूंगा ** जो भी 'getView() '** कहता है (दूसरे शब्दों में, ढांचा) ** ** getView() 'द्वारा लौटाए गए दृश्य को जोड़ने का ख्याल रखता है। – Joffrey

1

@ एक्सल 22 का जवाब महत्वपूर्ण है, लेकिन आपके कोड से कुछ और चीजें गायब हैं। सबसे पहले, आपको अपनी वरीयता के आधार पर बेसएडाप्टर या ऐरेएडाप्टर को विस्तारित करना चाहिए। दूसरा, आप ViewById को खोजने के लिए अत्यधिक कॉल करने से बचने के लिए व्यूहोल्डर का उपयोग करने के अभ्यास में जाना चाहते हैं, और (सबसे महत्वपूर्ण बात यह है कि) अपने व्यू को रीसाइक्लिंग करना।

private Class ViewHolder { 
    public TextView cityControl; 
    public TextView temperatureControl; 
    public ImageView skyControl; 
    public ViewHolder(TextView cityControl, TextView temperatureControl, ImageView skyControl) { 
    this.cityControl = cityControl; 
    this.temperatureControl = temperatureControl; 
    this.skyControl = skyControl; 
    } 

आपका getView समारोह विचारों रीसायकल और इस प्रकार ViewHolder वर्ग का उपयोग कर सकते हैं:

public View getView(int position, View convertView, ViewGroup parent) { 
    Weather weather = weatherList.get(position); 
    // This is how you attempt to recycle the convertView, so you aren't 
    // needlessly inflating layouts. 
    View v = convertView; 
    ViewHolder holder; 
    if (null == v) { 
     v = LayoutInflater.from(getContext()).inflate(R.layout.weather_row, parent, false); 
     TextView cityControl = (TextView)v.findViewById(R.id.city); 
     TextView temperatureControl = (TextView)v.findViewById(R.id.temperature); 
     ImageView skyControl = (ImageView)v.findViewById(R.id.sky); 
     holder = new ViewHolder(cityControl, temperatureControl, skyControl); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    holder.cityControl.setText("Metropolis"); 
    holder.temperatureControl.setText("78"); 
    holder.skyControl.setImageResource(R.drawable.daily_planet); 

    return v; 

}

टन के लिए अधिक उदाहरण (और अन्य अनुकूलन युक्तियों का), this blog post देखने के (या बस गूगल व्यूहोल्डर के लिए)।

संबंधित मुद्दे