bhagavan reddy
bhagavan reddy

Reputation: 43

Button click event in one row effects other rows in listview in android

I am having deliver button in every row of listview.when we click on deliver button,background image should be change for that particular row item(image change to deliver done image).Here I am able to change background image by writing code as setBackgroundResource.but the problem is it will effect to the other row items in listview that means when I am scrolling,other button images for their particular row items are also changed.I have tried for this issue from last three days but no use.Please give me suggestion for doing this.

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

          ![enter image description here][1]
            final ViewHolder holder;
           holder = new ViewHolder();


           if (convertView == null) {
               LayoutInflater vi = getLayoutInflater();
           convertView = vi.inflate(R.layout.ambassdor_orders_list_fields, null);
           }

           Routes rou=RouteList.get(position);

           holder.route = (Button) convertView.findViewById(R.id.deliverBtn);
           holder.memberName = (TextView) convertView.findViewById(R.id.memberNameTxt);
           holder.amount = (TextView) convertView.findViewById(R.id.amountTxt);

           holder.memberName.setText(rou.getMemberName());
           holder.amount.setText(rou.getAmount());

           holder.route.setTag(position);
           holder.memberName.setTag(position);
           holder.amount.setTag(position);

           convertView.setTag(holder);

           holder.route.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                holder.route.setBackgroundResource(R.drawable.done);                          

            }
            });
           convertView.setTag(R.id.routeButtton, holder.route);
           convertView.setTag(R.id.memberNameTxt, holder.memberName);
           convertView.setTag(R.id.amountTxt, holder.amount);
           return convertView;
     }  

Upvotes: 2

Views: 901

Answers (3)

bhagavan reddy
bhagavan reddy

Reputation: 43

my problem was solved by changing this line

 if(rou.isDone()) {
     //setBackground
        holder.route.setBackgroundResource(R.drawable.deliver_done);

     } else {
     //revert background
         holder.route.setBackgroundResource(R.drawable.deliver_not_done);
     }




   holder.route.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        rou.setDone(true);
        notifyDataSetChanged();

    }
    });

Upvotes: 0

bhagavan reddy
bhagavan reddy

Reputation: 43

here is my code

 if(rou.isDone()) {
         //setBackground
            holder.route.setBackgroundResource(R.drawable.deliver_done);

         } else {
         //revert background
             holder.route.setBackgroundResource(R.drawable.deliver_not_done);
         }
         notifyDataSetChanged();



       holder.route.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            rou.setDone(true);

        }
        });

Upvotes: 0

Deniz
Deniz

Reputation: 12530

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

                final ViewHolder holder;
                holder = new ViewHolder();


               if (convertView == null) {
                   LayoutInflater vi = getLayoutInflater();
                   convertView = vi.inflate(R.layout.ambassdor_orders_list_fields, null);

                   convertView.setTag(holder);

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

               Routes rou=RouteList.get(position);

               holder.route = (Button) convertView.findViewById(R.id.deliverBtn);
               holder.memberName = (TextView) convertView.findViewById(R.id.memberNameTxt);
               holder.amount = (TextView) convertView.findViewById(R.id.amountTxt);

               holder.memberName.setText(rou.getMemberName());
               holder.amount.setText(rou.getAmount());

               holder.route.setOnClickListener(new OnClickListener() {                  public void onClick(View v) {                                  
                          holder.route.setBackgroundResource(R.drawable.done);                          

                }
                });
               return convertView;
         }  

According to your code you should keep a field to denote the status of the route button background in the model data itself (Routes). so that add code to toggle background with this status.

When you click on button just update the status(eg. rou.setDone(true))

in your getView you can add the following code to update this

if(rou.getDone()) {
//setBackground
} else {
//revert background
}
notifyDatasetChanged()

Upvotes: 1

Related Questions