3

I have a listview which set up by using a custom listAdapter. There is button in each listView item to change the textView in same row. How can i make it ? Here is part of the code :

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    final int _position = position;
    if (convertView == null) {
        convertView = l_Inflater.inflate(R.layout.activity_today_sales_list_view, null);
        holder = new ViewHolder();
        holder.txt_itemName = (TextView) convertView.findViewById(R.id.itemNameTB);
        holder.txt_itemPrice = (TextView) convertView.findViewById(R.id.priceTB);
        holder.txt_plusBtn = (Button) convertView.findViewById(R.id.addBtn);
        holder.txt_minusBtn = (Button) convertView.findViewById(R.id.minusBtn);


        convertView.setTag(holder);

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

    holder.txt_plusBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

             Log.d("Plus Btn", "Clicked");

        }


    });

    holder.txt_minusBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Log.d("Minus Btn", "Clicked");

        }
    });

    holder.txt_itemName.setText(itemDetailsrrayList.get(position).getItemName());
    holder.txt_itemPrice.setText(itemDetailsrrayList.get(position).getItemCost());

    return convertView;
}
Eric N.
  • 33
  • 1
  • 4

4 Answers4

10

You can use below code to fix your issue.

    @Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = l_Inflater.inflate(R.layout.activity_today_sales_list_view, null);
        holder = new ViewHolder();
        holder.txt_itemPrice = (TextView) convertView.findViewById(R.id.priceTB);
        holder.txt_plusBtn = (Button) convertView.findViewById(R.id.addBtn);
        holder.txt_plusBtn.setOnClickListener(new View.OnClickListener() {

             @Override
            public void onClick(View v) {
                ViewHolder holder1 = (ViewHolder)v.getTag();
                //Access the Textview from holder1 like below
                holder1.txt_itemPrice.setText("Plus");

            }
        });

        convertView.setTag(holder);

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

    holder.txt_itemPrice.setText(itemDetailsrrayList.get(position).getItemCost());

    return convertView;
}
Dharmendra
  • 33,296
  • 22
  • 86
  • 129
0

Try this

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    final int _position = position;
    if (convertView == null) {
        convertView = l_Inflater.inflate(R.layout.activity_today_sales_list_view, null);
        holder = new ViewHolder();
        holder.txt_itemName = (TextView) convertView.findViewById(R.id.itemNameTB);
        holder.txt_itemPrice = (TextView) convertView.findViewById(R.id.priceTB);
        holder.txt_plusBtn = (Button) convertView.findViewById(R.id.addBtn);
        holder.txt_minusBtn = (Button) convertView.findViewById(R.id.minusBtn);


        convertView.setTag(holder);

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

    holder.txt_plusBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

                 Log.d("Plus Btn", "Clicked");
                 holder.txt_itemName.setText("Your String");
                 holder.txt_itemPrice.setText("Your String");

        }


    });

    holder.txt_minusBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            Log.d("Minus Btn", "Clicked");
            holder.txt_itemName.setText("Your String");
            holder.txt_itemPrice.setText("Your String");

        }
    });

    holder.txt_itemName.setText(itemDetailsrrayList.get(position).getItemName());
    holder.txt_itemPrice.setText(itemDetailsrrayList.get(position).getItemCost());

    return convertView;
}

Hope this helps.

ACengiz
  • 1,285
  • 17
  • 23
  • Hi, thank you for your suggestion. I get this error : Cannot refer to a non-final variable holder inside an inner class defined in a different method> Do u have any idea to fix this ? – Eric N. May 08 '13 at 10:13
0

set the ids of Button and TextView that you can differentiate when the button is clicked. What I mean is.. suppose you have 10 items that are to be displayed in a listview so getView() method will receive position ranging from 0 to 9. So what you can do here is set id of Buttons like 10+position and that of TextViews like 1000+position or any random number. So when a button is clicked, you can get the id of it, subtract 10 from it.. Now add 1000 to it to get the TextView and change it's text.

d3m0li5h3r
  • 1,957
  • 17
  • 33
0

Here is my own example that illustrates how to use the onClickListener correctly inside an Adapter. The functionality is almost the same as you. I have a list of products and inside my list-item, the user can increase or decrease the amount of bought items.

My item object that holder the item properties. It has an ID, a name and an order that refers to the number of times this item has been bought:

public class MenuItem {
    private int id;
    private String name;
    private int order = 0;

    public MenuItem(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

}

Here is a snippet of my Adapter that holds a list of MenuItems. The UI holds an up and down image button together with the name.

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        if (convertView == null) {
            LayoutInflater lInflater = ((Activity) mContext).getLayoutInflater();
            convertView = lInflater.inflate(R.layout.menu_item, parent, false);

            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.menu_name);
            holder.details = (TextView) convertView.findViewById(R.id.menu_details);
            holder.counter = (TextView) convertView.findViewById(R.id.menu_counter);
            holder.up = (ImageView) convertView.findViewById(R.id.menu_up);
            holder.down = (ImageView) convertView.findViewById(R.id.menu_down);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.name.setText(getMenuList().get(position).getName());
        holder.details.setText(getMenuList().get(position).getDetails());
        holder.counter.setText(String.valueOf(getMenuList().get(position).getOrder()));

        holder.up.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                onListItemClick(position, UP);
            }
        });

        holder.down.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                onListItemClick(position, DOWN);
            }
        });
        return convertView;
    }

    protected void onListItemClick(int position, int direction) {
        int numberOfOrders = getMenuList().get(position).getOrder();
        if (direction == DOWN && numberOfOrders == 0) {
            // Don't go negative!
            return;
        }

        getMenuList().get(position).setOrder(numberOfOrders +  direction);
            // in your case: itemDetailsrrayList.get(position).setOrder(...);
        notifyDataSetChanged();
    }

Have fun!

DroidBender
  • 7,762
  • 4
  • 28
  • 37