Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to use LayoutInflater in custom adapter

I'm looking into writing a custom adapter to populate a listview with 3 textviews per line. I've found quite a bit of example code to do this, but the one that seemed the best was at: http://www.anddev.org/custom_widget_adapters-t1796.html

After a few minor tweaks to fix some compiler issues with the latest Android SDK, I got it running, only to get the exception:

ERROR/AndroidRuntime(281): java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView

So I did a lot of research and found lots of possible reasons and fixes for this. None of which changed a thing. My adapter code is currently:

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;
    }

}

So I have tried the commented out way of getting the inflater, and the currently uncommented out. I have tried passing "parent" to inflate as well as null, and passing "true", "false" and omitting completely the last parameter. None of them have worked, and all examples I've found so far have been from 2008 which I get the feeling are a bit outdated.

If anyone could help with this then I would love to resolve the issue.

like image 794
Teknogrebo Avatar asked Nov 29 '10 17:11

Teknogrebo


2 Answers

I believe this line is at fault:

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

You need instead:

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

The false makes the inflated view independent of the parent, not attached to it, which very oddly seems to be the accepted design for custom views within AdapterViews. Why this is so, I find utterly baffling, but the pattern above worked for me.

like image 73
Clint Avatar answered Sep 30 '22 22:09

Clint


I'm a beginner also so take this answer with a pinch of salt - if it doesn't work, move on and Google some more. Not familiar with AdapterView since I traditionally have a ListView or GridView and a custom Adapter extended off a BaseAdapter and then listView.setAdapter(myCustomAdapter).

You could try making something like this inside the WeatherAdapter class:

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

Then in the class that calls WeatherAdapter:

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

Also you need to optimize it more in the getView method:

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

like image 33
albnok Avatar answered Sep 30 '22 22:09

albnok