Disposición incondicional, inflación del adaptador de la visión: Debe utilizar el patrón del sostenedor de la visión

Estoy recibiendo la siguiente advertencia en eclipse:

Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling. 

en:

 convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); 

Tengo un adaptador de base con una casilla de verificación implementada y he añadido una etiqueta para que funcione la casilla de verificación.

Aquí está el código:

  public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder mViewHolder; mViewHolder = new ViewHolder(); LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); mViewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); convertView.setTag(mViewHolder); if (InviteFriends.isChecked[position] == true) { mViewHolder.cb.setChecked(true); } else { mViewHolder.cb.setChecked(false); } mViewHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean ischecked) { if (buttonView.isChecked()) { InviteFriends.isChecked[position] = true; } else { InviteFriends.isChecked[position] = false; } } }); TextView friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image HashMap<String, String> song = new HashMap<String, String>(); song = data.get(position); // Setting all values in listview friendsname.setText(song.get(InviteFriends.KEY_DISPLAY_NAME)); imageLoader.DisplayImage(song.get(InviteFriends.KEY_IMAGEPROFILE_URL), thumb_image); return convertView; } 

Los resultados están llegando correctamente. ¿Cómo puedo corregir esta advertencia? No soy capaz de obtener una solución para esto todavía?

¡Gracias!

3 Solutions collect form web for “Disposición incondicional, inflación del adaptador de la visión: Debe utilizar el patrón del sostenedor de la visión”

Prueba esto

 static class ViewHolder { private TextView friendsname; private ImageView thumb_image; private CheckBox cb; } public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder mViewHolder = null; HashMap<String, String> song = null; if (convertView == null) { song = new HashMap <String, String>(); mViewHolder = new ViewHolder(); LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); mViewHolder.friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title mViewHolder.thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image mViewHolder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); convertView.setTag(mViewHolder); mViewHolder.cb.setTag(data.get(position)); mViewHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean ischecked) { InviteFriends.isChecked[position] = buttonView.isChecked(); } }); } else { mViewHolder = (ViewHolder) convertView.getTag(); } song = mViewHolder.cb.getTag(); mViewHolder.friendsname.setText(song.get(InviteFriends.KEY_DISPLAY_NAME)); mViewHolder.imageLoader.DisplayImage(song.get(InviteFriends.KEY_IMAGEPROFILE_URL), thumb_image); mViewHolder.cb.setChecked(InviteFriends.isChecked[position]); return convertView; } 

Usted debe init la opinión del convertido solamente si es null

Estas líneas

 LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); // [...] the rest of initialization part // [...] some changes that must be done at refresh return convertView; 

Debe verse así:

 if (convertView == null) { LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); // [...] the rest of initialization part } // [...] some changes that must be done at refresh return convertView; 

El objetivo es reciclar la vista ya existente en esa lista, no iniciarla cada vez que la muestre al desplazarse por la lista, por ejemplo.

Mi sugerencia es intentar utilizar convertView = vi.inflate(R.layout.activity_friend_list_row, null); convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); de convertView = vi.inflate(R.layout.activity_friend_list_row, parent, false); Esto puede ayudarle.

: – okey .. insted de acceso como este TextView friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image TextView friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image TextView friendsname = (TextView) convertView.findViewById(R.id.friendsName); // title ImageView thumb_image = (ImageView) convertView.findViewById(R.id.list_image); // thumb image tienes que usar la clase viewholder en tu adaptador

por ejemplo

 static class ViewHolder { public TextView text; public ImageView image; } @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; // reuse views if (rowView == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView = inflater.inflate(R.layout.rowlayout, null); // configure view holder ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01); viewHolder.image = (ImageView) rowView .findViewById(R.id.ImageView01); rowView.setTag(viewHolder); } // fill data ViewHolder holder = (ViewHolder) rowView.getTag(); String s = names[position]; holder.text.setText(s); if (s.startsWith("Windows7") || s.startsWith("iPhone") || s.startsWith("Solaris")) { holder.image.setImageResource(R.drawable.no); } else { holder.image.setImageResource(R.drawable.ok); } return rowView; } 
  • ¿Qué debo pasar por la raíz al inflar una presentación para utilizarla en ActionView de MenuItem?
  • gancho LayoutInflater y cambiar los valores al inflar las vistas
  • Problema de LayoutInflater de Android
  • FindViewById en la clase non-activity
  • Cómo guardar un diseño hinchado en android después de los cambios de configuración?
  • ¿Cuál es la diferencia entre los infladores
  • Cómo agregar una vista inflada a un diseño lineal
  • ¿Cuál es la forma correcta de obtener el inflador de diseño en Android?
  • Inflater en Android Fragmentos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.