Aman Sharma
Aman Sharma

Reputation: 47

When I scroll the listview the textview get its default value 0

I have two button increase and decrease and one textview. When I click on increase button the value in the textview is increases and vice versa but when I scroll the listview its get its default value 0. How can I resolve this?

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

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.cart_item, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.mImgItem = (ImageView) convertView.findViewById(R.id.cart_image);
            viewHolder.mTvItemName = (TextView) convertView.findViewById(R.id.tv_item_name);
            viewHolder.mTvItemPrice = (TextView) convertView.findViewById(R.id.tv_item_price);
            viewHolder.mTvNumber = (TextView) convertView.findViewById(R.id.tv_number);
            viewHolder.mBtnAdd = (Button) convertView.findViewById(R.id.btn_add);
            viewHolder.mBtnMinus = (Button) convertView.findViewById(R.id.btn_sub);
            viewHolder.mImgDelete = (ImageView) convertView.findViewById(R.id.img_del);
            viewHolder.mUniqueKey = String.valueOf(position);

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

        viewHolder.mBtnAdd.setTag(viewHolder);
        viewHolder.mBtnMinus.setTag(viewHolder);

        viewHolder.mTvNumber.setText("0");
        viewHolder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ViewHolder tagHolder = (ViewHolder) v.getTag();

                int mValue = Integer.parseInt(tagHolder.mTvNumber.getText().toString().trim());
                mValue++;
                tagHolder.mTvNumber.setText("" + mValue);    
        });

        viewHolder.mBtnMinus.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ViewHolder tagHolder = (ViewHolder) v.getTag();
                    int mValue = Integer.parseInt(tagHolder.mTvNumber.getText().toString());
                    if (mValue > 0) {
                        mValue--;
                        tagHolder.mTvNumber.setText("" + mValue);
                    }

        });

        convertView.setTag(viewHolder);

        PojoCart pojoCart = (PojoCart) getItem(position);
        viewHolder.mTvItemName.setText(pojoCart.getmItemName());
        viewHolder.mTvItemPrice.setText(pojoCart.getmItemPrice());

        return convertView;
    }

Upvotes: 0

Views: 73

Answers (4)

bendaf
bendaf

Reputation: 3031

You need to store the number in each list item for example use this function to change the value of the list item's number:

List<Integer> mList = new ArrayList<>(LIST_SIZE);

int changeNumber(int position, int value){
    mList.get(position) += value;
    return mList.get(position);
}

u can use this function like:

viewHolder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ViewHolder tagHolder = (ViewHolder) v.getTag();

            int mValue = Integer.parseInt(tagHolder.mTvNumber.getText().toString().trim());
            tagHolder.mTvNumber.setText("" + changeNumber(position,1);    
    });

    viewHolder.mBtnMinus.setOnClickListener(
        new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ViewHolder tagHolder = (ViewHolder) v.getTag();
                int mValue = Integer.parseInt(tagHolder.mTvNumber.getText().toString());
                if (mValue > 0) {
                    tagHolder.mTvNumber.setText("" + changeNumber(position,-1);
                }

    });

Upvotes: 0

Smit Davda
Smit Davda

Reputation: 638

Save the value to PojoCart class and retrieve value from it every time just as you are getting itemName and itemPrice. So create an integer quantity in PojoCart class and in the adapter's getView method :

PojoCart pojoCart = (PojoCart) getItem(position);
viewHolder.mBtnAdd.setTag(pojoCart);
viewHolder.mBtnMinus.setTag(pojoCart);
if(pojoCart.getQuantity() > 0)
{
   viewHolder.mTvNumber.setText(""+pojoCart.getQuantity());
}
else
{
   viewHolder.mTvNumber.setText(""+0);
}
viewHolder.mBtnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

          PojoCart pojoCart = (PojoCart) v.getTag();
            int mValue = pojoCart.getQuantity();
            mValue++;
            tagHolder.mTvNumber.setText("" + mValue);
            pojoCart.setQuantity(mValue)
            notifyDataSetChanged();
};

Upvotes: 1

AbhayBohra
AbhayBohra

Reputation: 2117

Use adapter.notifyDataSetChanged() to update values in listview when data changes

Upvotes: 0

Akshay Panchal
Akshay Panchal

Reputation: 695

You have to save value of textview. As listview recreate views on scroll it takes default Just take model class and save values by position

Upvotes: 0

Related Questions