Search code examples
androidlistviewandroid-studioandroid-adapterandroid-viewholder

change the value TextView change the values of other items into Custom Listview Android


I have a problem, changing from the buttons to increase the value of the quantity textview, in the list also change others that I am not interacting with.

As you see in the image below in the left part is the beginning of the list to which the quantity changes, but if under the scroll of that change affects other items in the list

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ScrollView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.TextHttpResponseHandler;
import com.squareup.picasso.Picasso;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONObject;

import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;

/**
 * Created by roberthdudiver on 8/2/17.
 */

public class ProductosAdapter extends BaseAdapter implements ListAdapter {
    private  JSONArray jsonArray;
    private Context context;

    public ProductosAdapter( JSONArray jsonArray, Context con) {

        assert jsonArray != null;
        context=con;
        this.jsonArray = jsonArray;

    }


    @Override public int getCount() {
        if(null==jsonArray)
            return 0;
        else
            return jsonArray.length();
    }

    @Override public JSONObject getItem(int position) {
        if(null==jsonArray) return null;
        else
            return jsonArray.optJSONObject(position);
    }

    @Override public long getItemId(int position) {
        JSONObject jsonObject = getItem(position);

        return jsonObject.optLong("id");
    }

    JSONObject json_data ;
    View ConvertView;
    static class ViewHolder {
        ImageView img;
        TextView text;
        TextView desc;
        TextView cantidad;
        TextView precio;
        int posicion=1;
        ScrollView mScrollView;
        SeekBar seekBar;
        float preciofl;
        Button Botonincrementar;
        Button Botondecrementar;
        ImageButton Boton;

    }
    private static final String TAG = "CustomAdapter";
    ViewHolder Holder;
    @Override public View getView(int position, View convertView, ViewGroup parent) {
        ConvertView=convertView;
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        Log.v(TAG, "in getView for position " + position + ", convertView is "
                + ((convertView == null) ? "null" : "being recycled"));

        if (ConvertView == null) {




            ConvertView = inflater.inflate(R.layout.lista_productos, parent, false);
            Holder = new ViewHolder();
            //inflater.inflate(R.layout.lista_productos, null);

            Holder.desc = (TextView) ConvertView.findViewById(R.id.titulo);
            Holder.cantidad = (TextView) ConvertView.findViewById(R.id.txtcantidad);
            Holder.Boton = (ImageButton) ConvertView.findViewById(R.id.botonagregar);
            Holder.text = (TextView) ConvertView.findViewById(R.id.h1);
            Holder.precio = (TextView) ConvertView.findViewById(R.id.precio);
            Holder.img = (ImageView) ConvertView.findViewById(R.id.img);
            Holder.seekBar = (SeekBar) ConvertView.findViewById(R.id.barra);
            Holder.Botonincrementar =(Button) ConvertView.findViewById(R.id.increment);
            Holder.Botondecrementar =(Button) ConvertView.findViewById(R.id.decrement);

            ConvertView.setTag(Holder);
        }
        else {
            Holder = (ViewHolder) ConvertView.getTag();
        }

            Holder.seekBar.setMax(10);
        Holder.Boton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ViewHolder es = (ViewHolder)v.getTag();
                ObjetoProductoPcarrito Obj = new ObjetoProductoPcarrito();
                Obj.nombre=es.text.getText().toString();
                Obj.cantidad= Float.parseFloat(es.cantidad.getText().toString());
                Obj.precio=es.preciofl;
                if( Obj.cantidad>0) {
                    Utilidades.ListaActual().add(Obj);
                }
              TextView infocarrito=  (TextView)Utilidades.ContextoPrincipalCarrito.findViewById(R.id.precio);
                String tot=String.valueOf(Utilidades.TotalCarrito());
                infocarrito.setText( tot+" Bs.");
                es.cantidad.setText("1");
                es.seekBar.setProgress(1);
                es.posicion=1;


            }
        });

        JSONObject json_data1 = getItem(position);

        Holder.Botondecrementar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ViewHolder es = (ViewHolder)v.getTag();
                int nume=Integer.parseInt(es.cantidad.getText().toString());

                if(nume>=2) {
                    nume--;
                    es.cantidad.setText(String.valueOf(nume));

                }
            }
        });
        Holder.Botonincrementar.setOnClickListener(Incrementarlistener);
        Holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

                ViewHolder es = (ViewHolder)seekBar.getTag();
                try {
es.posicion=i;
                    es.cantidad.setText(Integer.toString(i));
                }catch (Exception e){

                Log.e("Error", "unexpected JSON exception", e);

                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        if(null!=json_data1 ) {
            try {

                String jj = json_data1.getString("id");

                // try parse the string to a JSON object
                try {

                    String id = json_data1.getString("id");
                    String description = json_data1.getString("description");
                    String name = json_data1.getString("name");
                    String imagen = json_data1.getString("product_images");
                    String preciop = json_data1.getString("product_price");
                    float litersOfPetrol = Float.parseFloat(preciop);
                    DecimalFormat df = new DecimalFormat("0.00");
                    df.setMaximumFractionDigits(2);


                    preciop = df.format(litersOfPetrol);


                    try {
                        Holder.img.setTag("img-" + id);
                        Holder.text.setTag("text-" + id);
                        Holder.cantidad.setTag("cantidad-" + id);
                        Holder.seekBar.setTag(Holder);
                        Holder.seekBar.setProgress(Holder.posicion);
                        Holder.precio.setTag("precio-" + id);
                        Holder.Botonincrementar.setTag(Holder);
                        Holder.Botondecrementar.setTag(Holder);
                        Holder.Boton.setTag(Holder);

                    } catch (Exception e) {
                        Log.e("Error", "unexpected JSON exception", e);
                    }

                    Holder.text.setText(name);
                    Holder.desc.setText(Utilidades.LimpiarHtml(description));
                    Holder.text.setText(name);
                    Holder.preciofl = Float.parseFloat(preciop.replace(',', '.'));
                    Holder.precio.setText(preciop + " Bs.");
                    Holder.desc.setMovementMethod(new ScrollingMovementMethod());

                    System.out.println("Position ["+position+"]");

                    //  String imagen="http://"+ Utilidades.Url()+"/img/p/"+idimagen+"/"+idimagen+"-medium_default.jpg";
                    // Picasso.with(convertView.getContext()).load(imagen).into(img);
                    int es = R.drawable.precarga;


                    Picasso.with(ConvertView.getContext())
                            .load(imagen)
                            .placeholder(es)
                            .into(Holder.img);


                } catch (JSONException e) {
                    Log.e("JSON Parser", "Error parsing data " + e.toString());
                }


            } catch (JSONException e) {

                //  Log.e("MYAPP", "unexpected JSON exception", e);
                // Do something to recover ... or kill the app.
            }

        }

        return ConvertView;
    }



    private View.OnClickListener Incrementarlistener = new View.OnClickListener()
    {

        @Override
        public void onClick(View v) {
            ViewHolder es = (ViewHolder)v.getTag();



            int nume=Integer.parseInt(es.cantidad.getText().toString());

            if(nume<=99) {
                nume++;
                es.cantidad.setText(String.valueOf(nume));

            }
        }
    };
}

Solution

  • I change your class and whit this, you resolve the problem.

    import android.content.Context;
    import android.text.method.ScrollingMovementMethod;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    import com.squareup.picasso.Picasso;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    
    /**
     * Created by Roberth on 15/3/2017.
     */
    
    public class ProductosAdapterNew extends BaseAdapter {
        private  JSONArray jsonArray;
        private LayoutInflater inflater;
        private boolean[] itemSelection;
        private int[] itemvalues;
        private String[] itemvalues2;
        private Context context;
    
        public ProductosAdapterNew(JSONArray jsonArray, Context con) {
    
            assert jsonArray != null;
            context=con;
            this.jsonArray = jsonArray;
    
        }
    
    
    
        @Override public int getCount() {
            if(null==jsonArray)
                return 0;
            else {
                int tamano=jsonArray.length();
                this.itemSelection = new boolean[tamano];
                this.itemvalues = new int[tamano];
                this.itemvalues2 = new String[tamano];
                return jsonArray.length();
            }
        }
    
        @Override public JSONObject getItem(int position) {
            if(null==jsonArray) return null;
            else {
                return jsonArray.optJSONObject(position);
            }
        }
    
        @Override public long getItemId(int position) {
            JSONObject jsonObject = getItem(position);
            return jsonObject.optLong("id");
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            context = parent.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);
    
            convertView = inflater.inflate(R.layout.lista_productos, parent, false);
            final ProductosHolder holder = new ProductosHolder();
    
            holder.seekBar = (SeekBar) convertView.findViewById(R.id.barra);
            holder.cantidad = (TextView) convertView.findViewById(R.id.txtcantidad);
            holder.desc = (TextView) convertView.findViewById(R.id.titulo);
    
            holder.Boton = (ImageButton) convertView.findViewById(R.id.botonagregar);
            holder.text = (TextView) convertView.findViewById(R.id.h1);
            holder.precio = (TextView) convertView.findViewById(R.id.precio);
            holder.img = (ImageView) convertView.findViewById(R.id.img);
    
            holder.Botonincrementar =(Button) convertView.findViewById(R.id.increment);
            holder.Botondecrementar =(Button) convertView.findViewById(R.id.decrement);
            convertView.setTag(holder);
            holder.Boton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    ObjetoProductoPcarrito Obj = new ObjetoProductoPcarrito();
                    Obj.nombre=holder.text.getText().toString();
                    Obj.cantidad= Float.parseFloat(holder.cantidad.getText().toString());
                    Obj.precio=holder.preciofl;
                    if( Obj.cantidad>0) {
                        Utilidades.ListaActual().add(Obj);
                    }
                    TextView infocarrito=  (TextView)Utilidades.ContextoPrincipalCarrito.findViewById(R.id.precio);
                    String tot=String.valueOf(Utilidades.TotalCarrito());
                    infocarrito.setText( tot+" Bs.");
                    holder.cantidad.setText("1");
                    holder.seekBar.setProgress(1);
                    holder.posicion=1;
    
    
                }
            });
            holder.Botondecrementar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    int nume=Integer.parseInt(holder.cantidad.getText().toString());
    
                    if(nume>=1) {
                        nume--;
                        itemvalues[position]=nume;
                        itemvalues2[position] = String.valueOf(nume);
                        holder.cantidad.setText(itemvalues2[position]);
                        holder.seekBar.setProgress(itemvalues[position]);
                    }
                }
            });
            holder.Botonincrementar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
    
                    int nume=Integer.parseInt(holder.cantidad.getText().toString());
    
                    if(nume<=99) {
                        nume++;
                        itemvalues[position]=nume;
                        itemvalues2[position] = String.valueOf(nume);
                        holder.cantidad.setText(itemvalues2[position]);
                        holder.seekBar.setProgress(itemvalues[position]);
    
                    }
                }
            });
    
            holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    itemvalues[position] = holder.seekBar.getProgress();
                    itemvalues2[position] = String.valueOf(holder.seekBar.getProgress());
                    holder.cantidad.setText(itemvalues2[position]);
    
                    //   ProductosHolder es = (ProductosHolder) seekBar.getTag();
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
    
                }
            });
    
    
            try {
    
                JSONObject json_data1 = getItem(position);
    
    
                if (null != json_data1) {
                    try {
    
                        String jj = json_data1.getString("id");
    
                        // try parse the string to a JSON object
                        try {
    
                            String id = json_data1.getString("id");
                            String description = json_data1.getString("description");
                            String name = json_data1.getString("name");
                            String imagen = json_data1.getString("product_images");
                            String preciop = json_data1.getString("product_price");
                            float litersOfPetrol = Float.parseFloat(preciop);
                            DecimalFormat df = new DecimalFormat("0.00");
                            df.setMaximumFractionDigits(2);
    
    
                            preciop = df.format(litersOfPetrol);
    
    
    
                        holder.seekBar.setProgress(itemvalues[position]);
                            if(itemvalues2[position]!=null) {
                                holder.cantidad.setText(String.valueOf(itemvalues2[position]));
                            }
                            else {
                                holder.cantidad.setText("1");
    
                            }
                        holder.seekBar.setMax(10);
                        holder.text.setText(name);
                        holder.desc.setText(Utilidades.LimpiarHtml(description));
                        holder.text.setText(name);
                        holder.preciofl = Float.parseFloat(preciop.replace(',', '.'));
                        holder.precio.setText(preciop + " Bs.");
                        holder.desc.setMovementMethod(new ScrollingMovementMethod());
    
                        System.out.println("Position ["+position+"]");
    
                        //  String imagen="http://"+ Utilidades.Url()+"/img/p/"+idimagen+"/"+idimagen+"-medium_default.jpg";
                        // Picasso.with(convertView.getContext()).load(imagen).into(img);
                        int es = R.drawable.precarga;
                        Picasso.with(convertView.getContext())
                                .load(imagen)
                                .placeholder(es)
                                .into(holder.img);
    
                        } catch (JSONException e) {
                            Log.e("JSON Parser", "Error parsing data " + e.toString());
                        }
                    } catch (Exception e) {
    
                    }
                }
    
    
                holder.seekBar.setTag(holder);
    
    
    
            } catch (Exception es) {
    
                //  Log.e("MYAPP", "unexpected JSON exception", e);
                // Do something to recover ... or kill the app.
            }
    
            return convertView;
        }
    
        public int getItemsLength() {
            if(itemSelection == null) return 0;
            return itemSelection.length;
        }
    
        public void set(int i, boolean b) {
            itemSelection[i] = b;
        }
    }