Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List item repeating in android customized listview

In my customized list view items are repeating.position of item is same for all item. code is below

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

  }
like image 883
yuva ツ Avatar asked Sep 26 '13 05:09

yuva ツ


3 Answers

try this one, You need to setTag() for each convertview.

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

}
like image 134
Murali Ganesan Avatar answered Nov 17 '22 06:11

Murali Ganesan


Change your getView

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

Initialize inflater in your constructor. Remove this mLayout=new View(mContext) coz you are inflating a layout with mLayout=(LinearLayout) inflater.inflate(R.layout.list_menu, null)

In your 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 a View holder for smooth scrolling and performance.

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;
}
like image 1
Raghunandan Avatar answered Nov 17 '22 06:11

Raghunandan


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

    }
like image 1
Haresh Chhelana Avatar answered Nov 17 '22 06:11

Haresh Chhelana