Impossible d'utiliser LayoutInflater adaptateur personnalisé
-
29-09-2019 - |
Question
Je suis à la recherche dans l'écriture d'un adaptateur personnalisé pour remplir un ListView avec 3 textviews par ligne. Je l'ai trouvé à ce faire un peu de code exemple, mais celui qui semblait le meilleur était à:
La solution Je suis un débutant aussi pour prendre cette réponse avec une pincée de sel - si elle ne fonctionne pas, passez et Google un peu plus. Vous n'êtes pas familier avec Vous pouvez essayer de faire quelque chose comme ça dans la classe Ensuite, dans la classe que les appels Vous devez également optimiser plus dans la méthode getView: AdapterView
depuis que je suis traditionnellement un ListView
ou GridView
et un adaptateur personnalisée étendu au large d'un BaseAdapter
puis listView.setAdapter(myCustomAdapter)
. WeatherAdapter
: public void addToList(Weather mWeather) {
weatherList.add(mWeather);
}
WeatherAdapter
: weatherAdapter.addToList(weatherToAdd);
weatherAdapter.notifyDataSetChanged();
Autres conseils
Je crois que cette ligne est en faute:
View v = inflater.inflate(R.layout.weather_row, null, true);
Vous avez besoin au lieu:
View v = inflater.inflate(R.layout.weather_row, parent, false);
Le faux rend la vue indépendant gonflé du parent, pas attaché, ce qui semble très étrange d'être la conception acceptée pour des vues personnalisées dans AdapterView
s. Pourquoi est-ce, je trouve tout à fait déconcertant, mais le schéma ci-dessus a fonctionné pour moi.
Pour la méthode AdaptertView addView
:
addView void (Voir enfant)
Cette méthode est pas prise en charge et jette un UnsupportedOperationException quand appelé. »(De la documentation Android)
Probablement la procédure de gonflage appelle la méthode addView
et ce n'est pas possible d'un AdapterView
, ou son AdapterView
.
De la documentation:
"Un objet adaptateur agit en tant que pont entre une AdapterView et la données sous-jacentes pour ce point de vue. le Adapter permet d'accéder aux données articles. L'adaptateur est également responsable pour faire une vue pour chaque élément de la ensemble des données ».
Je pense que l'opération de gonflage pourrait être fait à partir d'une simple activité que les modèles de votre vue et toutes les autres opérations, par exemple, la récupération de données et montrant des données dans d'autres classes.
espère que ce sera utile!
@ La réponse de Axel22 est la clé, mais il y a quelques autres choses qui manquent dans votre code. Tout d'abord, vous devez être soit d'étendre BaseAdapter ou ArrayAdapter, selon vos préférences. Deuxièmement, vous voulez obtenir dans la pratique d'utiliser un ViewHolder pour éviter de faire des appels excessifs à findViewById, et (surtout) le recyclage de votre vue.
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;
}
Votre fonction getView peut recycler des vues et utiliser la classe ViewHolder
comme suit:
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;
}
Pour plus d'exemples de tonnes (et d'autres conseils d'optimisation), voir ce blog (ou tout simplement google pour ViewHolder).