nicole kidman
nicole kidman

Reputation: 5

Android : Listview Change Button Text On clilck

When I click on the first button only clicked on one button it sets the button background ok . but problem when I scroll down i found more buttons was changed randomly look like picture.

See picture here.

part of code :- ContactSug_Adapter

public class ContactSug_Adapter extends ArrayAdapter {

    List list = new ArrayList();
    ImageLoader imgLoader = new ImageLoader(getContext());
    private Context context;
    public ContactSug_Adapter(Context context, int resource) {
        super(context, resource);
    }

    @Override
    public void add(Object object) {
        super.add(object);
        list.add(object);
    }

    @Override
    public int getCount() {
        return super.getCount();
    }

    @Override
    public Object getItem(int position) {
        return this.list.get(position);
    }


    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View row;
        row = convertView;
        final ContactHolder contactHolder;
        if (row == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.row, parent, false);
            contactHolder = new ContactHolder();
            contactHolder.tx_id = (TextView) row.findViewById(R.id.usersName2);
            contactHolder.tx_name = (TextView) row.findViewById(R.id.usersName);
            contactHolder.sug_add = (Button) row.findViewById(R.id.sug_id);

            row.setTag(contactHolder);


        } else {
            contactHolder = (ContactHolder) row.getTag();

        }
        final Contacts_Sug contacts = (Contacts_Sug) this.getItem(position);
        contactHolder.image_tx.setImageResource(R.mipmap.ic_launcher);
        contactHolder.tx_id.setText(contacts.getId());
        contactHolder.tx_name.setText(contacts.getName());
        contactHolder.sug_add.setTag(position);

        contactHolder.sug_add.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                contactHolder.sug_add.setText("Selected");

            }
        });


        return row;
    }


    public class ContactHolder {
        TextView tx_id, tx_name,loadId;
        ImageView image_tx;
        public Button sug_add;

    }/********* act

Upvotes: 0

Views: 119

Answers (1)

Shadab Ansari
Shadab Ansari

Reputation: 7070

This is due to recycling of views. You need to set the text "Selected" for the items you want to be and set the default text for the other items. You can do that using if-else statement.

For that you need to have a member variable in Contacts_Sug to hold the selectionPos like this -

 private int selectionPos; 

public void setSelectedPosition(int position){
    selectionPos = position;
}

public int getSelectedPosition(){
    return selectionPos;
}

And set it in button onClick() -

contactHolder.sug_add.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                contacts.setSelectedPosition(position); //Set position here
                contactHolder.sug_add.setText("Selected");

            }
        });

And outside this onClick() where you are setting the values for your views. Add this -

if(contacts.getSelectedPosition() == position){
       //Set your button state to "selected" here
       contactHolder.sug_add.setText("Selected");
} else{
       //Set your button state to default here
      contactHolder.sug_add.setText("Follow");
}

Upvotes: 1

Related Questions