7

Я занимаюсь написанием пользовательского адаптера, чтобы заполнить список из 3 текстовых просмотров на строку. Для этого я нашел довольно примерный код, но тот, который казался лучшим, был у: http://www.anddev.org/custom_widget_adapters-t1796.htmlНевозможно использовать LayoutInflater в пользовательском адаптере

После нескольких небольших настроек, чтобы исправить некоторые проблемы с компилятором с последним Android SDK, я получил его, только, чтобы получить исключение:

ERROR/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, и в настоящее время раскомментировал вне. Я попытался передать «родительский», чтобы надуть, а также «нуль», и передал «true», «false» и полностью исключил последний параметр. Ни один из них не работал, и все примеры, которые я нашел до сих пор, были с 2008 года, которые у меня возникают, немного устарели.

Если бы кто-нибудь мог помочь с этим, я бы с удовольствием решил проблему.

ответ

6

Я тоже новичок, поэтому возьмите этот ответ с щепоткой соли - если он не работает, перейдите и Google еще несколько. Не знаком с AdapterView, так как у меня традиционно есть ListView или GridView, а пользовательский адаптер расширен с BaseAdapter, а затем listView.setAdapter(myCustomAdapter).

Вы можете попробовать сделать что-то вроде этого внутри WeatherAdapter класса:

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

Тогда в классе, который вызывает WeatherAdapter:

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

Также вам нужно оптимизировать его больше в методе GetView:

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

3

Для AdaptertView addView метода:.

недействительным addView (Просмотр ребенка)

Этот метод не поддерживается и бросает UnsupportedOperationException когда называется»(от Android документации)

Вероятно, процедура надувания вызывает метод addView, и это невозможно из AdapterView или его AdapterView.

Из документации:

«Объект адаптер действует в качестве моста между AdapterView и , лежащих в основе данных для этой точки зрения.Адаптер обеспечивает доступ к данным . Адаптер также отвечает для создания View для каждого элемента в наборе данных».

Я думаю, что операцию накачивания можно сделать из простой деятельности, которая моделирует вашу точку зрения и все другие операции, например, ., извлечение данных и отображение данных в других классах

Надеются, что это будет полезно

16

Я считаю, что эта линия виновата:

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

Вы должны вместо этого:

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

Ложный делает завышенный вид независимый от родителей, не прилагается к нему, что очень странно, кажется, принятой конструкции для пользовательских представлений в AdapterView с. Почему это так, я нахожу совершенно непонятным, но образец выше работал для меня.

+2

При использовании `AdapterView` вы хотите, чтобы ваши представления не зависели от родителя,` getView() `позаботится о том, чтобы привязать его к родительскому для вас. – 2013-02-05 01:01:27

1

@ Ответ на Axel22 является ключевым, но в вашем коде есть еще несколько вещей. Во-первых, вы должны расширить либо BaseAdapter, либо ArrayAdapter, в зависимости от ваших предпочтений. Во-вторых, вы хотите воспользоваться практикой использования ViewHolder, чтобы избежать чрезмерных вызовов findViewById и (что наиболее важно) переработать ваш View.

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 (или просто Google для ViewHolder).

Смежные вопросы