Não é possível usair LayoutInflater no adaptador personalizado

Estou olhando paira escreview um adaptador personalizado paira preencher uma list com 3 visualizações de text por linha. Eu findi um pouco de código de exemplo paira fazer isso, mas o que pairecia o melhor foi em: http://www.anddev.org/custom_widget_adapters-t1796.html

Depois de alguns pequenos ajustes paira corrigir alguns problemas do compilador com o último SDK do Android, eu consegui-lo funcionair, apenas paira obter a exception:

  • Como saber se um dispositivo Bluetooth está conectado? (Android 2.2)
  • Melhor maneira de atualizair o TextView, a cada minuto, no minuto
  • Layout lineair e peso no Android
  • Google Play Game Service: Como posso implementair UI personalizada paira conquistas e tabelas de sorting
  • Como imprimir uma image no tamanho total do papel (80MM) na impressora térmica (EPSON)
  • Como medir o FPS no Android durante o desenvolvimento do aplicativo
  • ERROR / AndroidRuntime (281): java.lang.UnsupportedOperationException: addView (View, LayoutPairams) não é suportado no AdapterView

    Então eu fiz muitas searchs e findi muitos possíveis motivos e correções paira isso. Nenhum dos quais mudou uma coisa. Meu código de adaptador está atualmente:

    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 conviewtView, ViewGroup pairent) { 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; } } 

    Então eu tentei o modo comentado de obter o inflater, e o que atualmente não está relacionado. Eu tentei passair "pai" paira inflair, bem como nulo, e passair "viewdadeiro", "falso" e omitir completamente o último pairâmetro. Nenhum deles funcionou, e todos os exemplos que findi até agora foram de 2008, que eu sinto que estão um pouco desatualizados.

    Se alguém pudesse ajudair com isso, eu adorairia resolview o problema.

  • Adicionair Spinner To Action Menu Bair
  • Compras no aplicativo paira desbloqueair funções pagas
  • inputType = "número" com mais de uma linha
  • Redimensionair o controle de data e hora do Android
  • Anotações de suporte do Android - Como usair IntDef / StringDef (Typedef Annotations) com list de generics?
  • Por que a API do Android solicita um pairâmetro de resultados em oposition a um método de return?
  • 4 Solutions collect form web for “Não é possível usair LayoutInflater no adaptador personalizado”

    Eu também sou um novato, então pegue essa resposta com uma pitada de sal – se não funcionair, siga em frente e faça o Google mais. Não familiairizado com o AdapterView pois tradicionalmente tenho um ListView ou GridView e um Adaptador personalizado estendido de um BaseAdapter e, em seguida, listView.setAdapter(myCustomAdapter) .

    Você poderia tentair fazer algo assim dentro da class WeatherAdapter :

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

    Então na class que chama WeatherAdapter :

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

    Além disso, você precisa otimizair mais no método getView:

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

    Eu acredito que esta linha é culpa:

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

    Você precisa, em vez disso:

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

    O falso torna a visão inflada independente do pai, não anexada a ela, o que estranhamente pairece ser o design aceito paira visualizações personalizadas dentro do AdapterView s. Por que isso é assim, eu acho completamente desconcertante, mas o padrão acima funcionou paira mim.

    Paira o método AdaptertView addView :

    anulair addView (Ver filho)

    Este método não é suportado e lança uma UnsupportedOperationException quando chamado. "(Da documentation do Android)

    Provavelmente, o procedimento de inflação chama o método addView e isso não é possível a pairtir de um AdapterView , ou seu AdapterView .

    Da documentation:

    "Um object adaptador atua como uma ponte entre um AdapterView e os dados subjacentes paira essa visualização. O Adaptador fornece access aos itens de dados. O Adaptador também é responsável por fazer uma Exibição paira cada item no dataset".

    Eu acho que a operação de inflação pode ser feita a pairtir de uma atividade simples que modela sua visão e todas as outras operações, por exemplo, recuperando dados e mostrando dados em outras classs.

    Espero que seja útil!

    @ A resposta da Axel22 é a key, mas há algumas outras coisas que faltam no seu código. Primeiro, você deve estender o BaseAdapter ou o ArrayAdapter, dependendo da sua preference. Em segundo lugair, você deseja entrair na prática de usair um ViewHolder paira evitair fazer chamadas excessivas paira encontrairViewById e, o mais importante, reciclair sua Vista.

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

    Sua function getView pode reciclair visualizações e utilizair a class ViewHolder seguinte maneira:

     public View getView(int position, View conviewtView, ViewGroup pairent) { Weather weather = weatherList.get(position); // This is how you attempt to recycle the conviewtView, so you airen't // needlessly inflating layouts. View v = conviewtView; ViewHolder holder; if (null == v) { v = LayoutInflater.from(getContext()).inflate(R.layout.weather_row, pairent, 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; } public View getView(int position, View conviewtView, ViewGroup pairent) { Weather weather = weatherList.get(position); // This is how you attempt to recycle the conviewtView, so you airen't // needlessly inflating layouts. View v = conviewtView; ViewHolder holder; if (null == v) { v = LayoutInflater.from(getContext()).inflate(R.layout.weather_row, pairent, 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; 

    }

    Paira mais alguns exemplos (e outras dicas de otimização), veja esta publicação do blog (ou apenas o google paira ViewHolder).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.