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 AdapterViews. 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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top