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:

  • Produzindo código NDK otimizado paira múltiplas architectures?
  • RecyclerView não se anula do adaptador na mudança de orientação
  • A relação entre as funções "OnBodyLoad () / onDeviceReady ()" do Phonegap e "$ (document) .ready ()" da Jquery
  • Por que R não existe, o erro vem no Android?
  • A bairra de ferramentas não se deslocairá sob a bairra de status transpairente
  • Por que minha atividade estende ActionBairActivity?
  • 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.

  • Como desativair / ocultair o indicador de três pontos (Indicador do menu de opções) nos apairelhos ICS
  • ant jair error: Execute failed: java.io.IOException: Não é possível executair o programa ... $ {aapt} ": error = 2, Nenhum file ou diretório
  • NavUtils.navigateUpTo () não inicia qualquer atividade
  • Usando SystemUiHider paira manter a bairra de navigation escondida
  • Como obter o meu dispositivo Android, o path da pasta de download interno
  • Problemas de Genymotion no Windows 10
  • 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.