studio personalizado personalizada llenar lista for elementos dinamico agregar android listview baseadapter

personalizado - Lista de elementos que se repiten en la vista de lista personalizada de Android



llenar un listview android (5)

En mi lista personalizada, los elementos de la vista se repiten. La posición del artículo es la misma para todos los artículos. el código está debajo

ListAdapter.java-

public class ListAdapter extends BaseAdapter{ private List<String> mName; private List<Drawable> mIcon; private Context mContext; public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { this.mContext=mContext; this.mName=Name; this.mIcon=Icon; } @Override public int getCount() { // TODO Auto-generated method stub return mName.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View v, ViewGroup parent) { View mLayout; TextView mText; ImageView mImage; CheckBox mCheckBox; if(v==null){ LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mLayout=new View(mContext); mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null); mText=(TextView) mLayout.findViewById(R.id.Name); mImage=(ImageView) mLayout.findViewById(R.id.Icon); mCheckBox=(CheckBox) mLayout.findViewById(R.id.mCheckbox); mText.setText(mName.get(position)); mImage.setImageDrawable(mIcon.get(position)); mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton check, boolean isChecked) { if(check.isChecked()){ Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); } } }); } else{ mLayout=(View)v; } return mLayout; } }


Cambia tu getView

LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mLayout=new View(mContext); mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null);

Inicializa el inflador en tu constructor. Elimine este mLayout=new View(mContext) porque está inflando un diseño con mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

En tu constructor

LayoutInflater inflater; public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.mContext=mContext; this.mName=Name; this.mIcon=Icon; }

Use un soporte View para un desplazamiento y rendimiento suaves.

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

@Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder vh; if(convertView==null){ vh = new ViewHolder(); convertView =(LinearLayout) inflater.inflate(R.layout.list_menu, null); vh.mText=(TextView) convertView.findViewById(R.id.Name); vh.mImage=(ImageView) convertView.findViewById(R.id.Icon); vh.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); } vh.mText.setText(mName.get(position)); vh.mImage.setImageDrawable(mIcon.get(position)); vh.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton check, boolean isChecked) { if(check.isChecked()){ Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); } } }); return convertView; } static class ViewHolder { TextView mText; ImageView mImage; CheckBox mCheckBox; }


prueba este, necesitas establecer setTag() para cada conversión.

@Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder mHolder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_menu, null); mHolder = new ViewHolder(); mHolder.mText=(TextView) convertView.findViewById(R.id.appName); mHolder.mImage=(ImageView) convertView.findViewById(R.id.appIcon); mHolder.mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); convertView.setTag(mHolder); } else { mHolder = (ViewHolder) convertView.getTag(); } return convertView; } private class ViewHolder { private TextView mText; private ImageView mImage; private CheckBox mCheckBox; }


// try this public class ListAdapter extends BaseAdapter { private List<String> mName; private List<Drawable> mIcon; private Context mContext; public ListAdapter(Context mContext, List<String> Name, List<Drawable> Icon) { this.mContext=mContext; this.mName=Name; this.mIcon=Icon; } @Override public int getCount() { // TODO Auto-generated method stub return mName.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View v, ViewGroup parent) { ViewHolder holder; if(v==null){ holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v =(LinearLayout) inflater.inflate(R.layout.list_menu, null); holder.mText=(TextView) v.findViewById(R.id.Name); holder.mImage=(ImageView) v.findViewById(R.id.Icon); holder.mCheckBox=(CheckBox) v.findViewById(R.id.mCheckbox); v.setTag(holder); } else{ holder = (ViewHolder) v.getTag(); } holder.mText.setText(mName.get(position)); holder.mImage.setImageDrawable(mIcon.get(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton check, boolean isChecked) { if(check.isChecked()){ Toast.makeText(mContext, "..."+mName.get(position)+"..."+position, Toast.LENGTH_SHORT).show(); } } }); v.setTag(holder); return v; } class ViewHolder{ TextView mText; ImageView mImage; CheckBox mCheckBox; } }


Asegúrese de que convertView no sea nulo. Por lo tanto, coloque todo el código después de if (convertView == null) {} que asegura que tiene un convertView cuyo valor no es nulo, inflando desde el contexto si es así.

@Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.list_menu, parent, false); } TextView mText=(TextView) convertView.findViewById(R.id.appName); ImageView mImage=(ImageView) convertView.findViewById(R.id.appIcon); CheckBox mCheckBox=(CheckBox) convertView.findViewById(R.id.mCheckbox); mText.setText(mName.get(position)); mImage.setImageDrawable(mIcon.get(position)); return convertView; }


Si usa extends BaseAdapter entonces esta solución funcionará. https://.com/a/28791031/4531507