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