usar new icon example codigo borderfactory java android layout-inflater

java - new - Diseño incondicional, inflación desde el adaptador de vista: debería usar el patrón de Vista del titular



new icon java (4)

Inflado de disposición incondicional desde el adaptador de visualización: debe usar el patrón de Vista de titular (use la vista reciclada pasada a este método como el segundo parámetro) para un desplazamiento más suave.

Significa que debe usar el patrón de Vista del titular en su Adaptador. El objetivo de usar View Holder es reutilizar las vistas porque inflar y usar findViewById son lentas.

Cuando estás usando el siguiente 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); ... return convertView; }

no estás reutilizando las vistas, sino que siempre creas nuevas vistas.

Debes cambiar tu código a algo como esto (por favor revisa el comentario):

// class for holding the cached view static class ViewHolder { TextView tvFriendsName; ImageView imvThumbImage; CheckBox cbInviteFriend; } public View getView(final int position, View convertView, ViewGroup parent) { // holder of the views to be reused. ViewHolder viewHolder; // get data based on the position HashMap<String, String> song = data.get(position); // if no previous views found if (convertView == null) { // create the container ViewHolder viewHolder = new ViewHolder(); // inflate the views from layout for the new row LayoutInflater inflater = LayoutInflater.from(parent.getContext()); convertView = inflater.inflate(R.layout.rowlayout, parent, false); // set the view to the ViewHolder. viewHolder.cbInviteFriend = convertView.findViewById(R.id.checkBox); viewHolder.tvFriendsName = convertView.findViewById(R.id.friendsName); viewHolder.imvThumbImage = convertView.findViewById(R.id.list_image); // save the viewHolder to be reused later. convertView.setTag(viewHolder); } else { // there is already ViewHolder, reuse it. viewHolder = (ViewHolder) convertView.getTag(); } // now we can set populate the data via the ViewHolder into views viewHolder.tvFriendsName.setText(song.get(InviteFriends.KEY_DISPLAY_NAME)); imageLoader.DisplayImage(song.get(InviteFriends.KEY_IMAGEPROFILE_URL), viewHolder.imvThumbImage); viewHolder.cbInviteFriend.isChecked(InviteFriends.isChecked[position]); return convertView; }

Estoy recibiendo la siguiente advertencia en eclipse:

Inflado de disposición incondicional desde el adaptador de visualización: debe usar el patrón de Vista de titular (use la vista reciclada pasada a este método como el segundo parámetro) para un desplazamiento más suave.

en:

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

Tengo un adaptador base con un CheckBox implementado y he agregado una etiqueta para que el CheckBox funcione.

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 subiendo correctamente. ¿Cómo arreglo esta advertencia? No puedo obtener una solución para esto todavía?

¡Gracias!


Mi sugerencia es intentar usar 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 ayudarte.

: - okey ... insinuado de tener 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 debes 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; }


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


debe iniciar la vista de conversión solo si es nula

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;

debería 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 existente en esa lista, no iniciarla cada vez que la visualice al desplazarse por la lista, por ejemplo.