user755
user755

Reputation: 2661

Images shuffled while scrolling Listview with image, text and checkbox

As the title say's I have a listview like

|default-Image | text| checkbox |


I'm able to save the checkbox status and maintain its state while scrolling the listview but I'm not able to fix the same bevahiour witht the imageview

here is my getvew()

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder = null;
if (convertView == null) {
    LayoutInflater inflator = context.getLayoutInflater();
    convertView = inflator.inflate(R.layout.row, null);
    viewHolder = new ViewHolder();
    viewHolder.text = (TextView) convertView.findViewById(R.id.label);
    viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check);
    viewHolder.imageview= (ImageView) convertView.findViewById(R.id.imageView1);
    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                    list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
                }
            });
    convertView.setTag(viewHolder);
    convertView.setTag(R.id.label, viewHolder.text);
    convertView.setTag(R.id.check, viewHolder.checkbox);
    convertView.setTag(R.id.imageView1, viewHolder.imageview);

} else {
    viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.checkbox.setTag(position); // This line is important.
viewHolder.imageview.setTag(position);
viewHolder.text.setText(list.get(position).getName());
viewHolder.checkbox.setChecked(list.get(position).isSelected());


//        change the default-image here
if(list.get(position).getcontact_id()==5)
{
    viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map);
}

return convertView;

}

Upvotes: 0

Views: 854

Answers (3)

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

Try this way

public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;
         if ((convertView == null) || (convertView.getTag() == null)) {
            LayoutInflater inflator = context.getLayoutInflater();
            convertView = inflator.inflate(R.layout.row, null);
            viewHolder = new ViewHolder();


        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.text = (TextView) convertView.findViewById(R.id.label);
        viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check);
        viewHolder.imageview = (ImageView) convertView.findViewById(R.id.imageView1);
        viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag(); // Here we
                                                                    // get
                                                                    // the
                                                                    // position
                                                                    // that
                                                                    // we
                                                                    // have
                                                                    // set
                                                                    // for
                                                                    // the
                                                                    // checkbox
                                                                    // using
                                                                    // setTag.
                list.get(getPosition).setSelected(buttonView.isChecked()); // Set
                                                                            // the
                                                                            // value
                                                                            // of
                                                                            // checkbox
                                                                            // to
                                                                            // maintain
                                                                            // its
                                                                            // state.
            }
        });


        viewHolder.checkbox.setTag(position); // This line is important.
        viewHolder.imageview.setTag(position);
        viewHolder.text.setText(list.get(position).getName());
        viewHolder.checkbox.setChecked(list.get(position).isSelected());

        // change the default-image here
        if (list.get(position).getcontact_id() == 5) {
            viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map);
        }
        convertView.setTag(viewHolder);
        return convertView;
    }

Upvotes: 0

kalyan pvs
kalyan pvs

Reputation: 14590

I have also faced same problem like that..remove checking with convertview is null or not..

if (convertView == null) {}

try to inflate the view and set it..i have solved my problem like that..try it may work..

Upvotes: 1

flx
flx

Reputation: 14226

The problem is, that you are only updating the image when getcontact_id() == 5

if(list.get(position).getcontact_id() == 5) {
    viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map);
} else {
    viewHolder.imageview.setImageResource(/* set some image here */);
}

Upvotes: 1

Related Questions