blue dream
blue dream

Reputation: 101

Listview with edittext value lost while scrolling

I'm not expert in android listview and Edittext. However, I am stuck with some annoying problem regarding this issue. I am fetching values in listview without any problem but when I input something in Edittext and scroll down the value of EditText changes it's position. Here is my code. //product class

public class products {
    public String prod_sl;
    public String prod_code;
    public String product_name;
    public String product_desc;
    public String prod_qnty;
    public String prod_uom;
    public String prod_price;
    boolean ShowName;
    public products(String psl, String pcode,String Name, String Desc, String UOM) {
        this.prod_sl = psl;
        prod_code = pcode;
        prod_qnty="";
        prod_price ="";
        product_name=Name;
        product_desc=Desc;
        prod_uom =UOM;
    }
   /* public boolean isShowName() {
        return ShowName;
    }
    public void setShowName(boolean showName) {
        ShowName = showName;
    }*/
    //sl
    public String getSl() {         return prod_sl;     }
    public void setSl(String psl) {         this.prod_sl = psl;     }
//product code
    public String getCode() {         return prod_code;     }
    public void setCode(String pcode) {         this.prod_code = pcode;     }
    //product Name
    public String getName() {         return product_name;     }
    public void setName(String product_name) {         this.product_name = product_name;     }
    //product desc
    public String getDesc() {         return product_desc;     }
    public void setDesc(String product_desc) {         this.product_desc = product_desc;     }
    //product UOM
    public String getUom() {         return prod_uom;     }
    public void setUom(String prod_uom) {         this.prod_uom = prod_uom;     }
    // product quantity

    public String getQnty() {
        return prod_qnty;     }
    public void setQnty(String prod_qnty) {
        this.prod_qnty = prod_qnty;     }
//product price
    public String getPrice() {
        return prod_price;     }
    public void setPrice(String prod_price) {
        this.prod_price = prod_price;     }

}

And here is the adapter class

public class ListViewAdapter extends ArrayAdapter<products> {

    Context mContext;
    View v;
    private String[] arrTemp;
    LayoutInflater inflater;

    ArrayList<products> arrayproducts;
    public   String[] scoresToUpdate=new String[1000];
    //public String Array scoresToUpdate =scoresToUpdate[];
    public static EditText edit_qnty,prod_price;
    public static HashMap<Integer,String> myList=new HashMap<Integer,String>();
    public ListViewAdapter(Context context, int resource, ArrayList<products> arrayproducts) {
        super(context, resource);
        this.mContext = context;
        this.arrayproducts = arrayproducts;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override

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

            final int pos=position;
            final ViewHolder holder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.list_adapter_view, null);
                holder = new ViewHolder();
                holder.prod_sl = (TextView) convertView.findViewById(R.id.prod_sl);
                holder.prod_code = (TextView) convertView.findViewById(R.id.prod_code);
                holder.txtTitle = (TextView) convertView.findViewById(R.id.adapter_text_title);
                holder.txtDescription = (TextView) convertView.findViewById(R.id.adapter_text_description);
                holder.prod_uom = (TextView) convertView.findViewById(R.id.prod_uom);
                holder.prod_qnty = (EditText) convertView.findViewById(R.id.prod_qnty);
                holder.prod_price = (EditText) convertView.findViewById(R.id.prod_price);
               // edit_qnty = (EditText) convertView.findViewById(R.id.prod_qnty);


                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
              //  holder.prod_qnty.setText(scoresToUpdate[pos]);
            }
                holder.ref = position;

                products prod = arrayproducts.get(position);
                holder.prod_sl.setText("" + position);
                holder.prod_code.setText(prod.getCode());
                holder.txtTitle.setText(prod.getName());
                holder.txtDescription.setText(prod.getDesc());
                holder.prod_uom.setText(prod.getUom());
                Log.e("row values",""+position+"\t-"+prod.getCode()+""+prod.getName()+""+prod.getDesc()+""+prod.getUom());
               // holder.prod_qnty.setText(arrTemp[position]);

                 holder.prod_qnty.setText(scoresToUpdate[position]);
                holder.prod_qnty.addTextChangedListener(new TextWatcher() {

                    @Override
                    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                        // TODO Auto-generated method stub
                        arrayproducts.get(pos).setQnty(holder.prod_qnty.getText().toString().trim());
                        myList.put(pos,arg0.toString().trim());
                        if (!arg0.equals("0")){
                        scoresToUpdate[pos] = arg0.toString();
                            Log.e("On text Change","Pos"+pos+"\tqnty:"+holder.prod_qnty.getText().toString().trim()+"\t Args: "+arg0.toString());
                        }
                    }

                    @Override
                    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                                  int arg3) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void afterTextChanged(Editable arg0) {
                        // TODO Auto-generated method stub
                        Log.e("After Text change","Pos"+holder.ref+"\tqnty:"+holder.prod_qnty.getText().toString().trim());
                       // arrTemp[holder.ref] = arg0.toString();

                    }
                });
            //holder.prod_qnty.setText(myList.get(position));

                holder.prod_qnty.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub

                    Log.e("Current Qnty",edit_qnty.getText().toString().trim());
                    if(holder.prod_qnty.getText().toString().trim().equals("0")){

                        holder.prod_qnty.setText("");
                    }
                    String inttext = (""+holder.prod_qnty.getText().toString().trim());

                    if (!inttext.equals("0")){
                        holder.prod_price.setText("");
                    }

                    return false;
                    //return true;
                }
            });



            //Using setOnclickListener not setOnCheckedChangeListener
            //we need to update adapter once we finish with editing

            /* holder.prod_qnty.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            public void onFocusChange(View v, boolean hasFocus) {

                if (!hasFocus) {
                final int pos = v.getId();
                final EditText Qnty = (EditText) v;
                Log.e("Qnty For the positon","POS: "+pos+"\tQnty: "+Qnty.getText().toString().trim());
                arrayproducts.get(pos).setQnty(Qnty.getText().toString().trim());
                //holder.prod_qnty.setText(Caption.getText().toString().trim());
                }

                }

            });*/
            /*  holder.prod_price.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            public void onFocusChange(View v, boolean hasFocus) {

                if (!hasFocus) {
                final int position = v.getId();
                final EditText Caption = (EditText) v;
                arrayproducts.get(position).setPrice(Caption.getText().toString().trim());
                }

            }

            });
*/
            return convertView;

        }
        catch(Exception e){
            Toast.makeText(mContext, "!!!", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
            Log.e("Exception:",""+e.toString());
        }
        return convertView;
    }
/*    @Override

    public int getCount() {

        return arrayproducts.size();

    }*/

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        if(arrayproducts != null && arrayproducts.size() != 0){
            return arrayproducts.size();
        }
        return 0;
    }

    /*@Override
    public Objects getItem(int position) {
        // TODO Auto-generated method stub
        return arrayproducts[position];
    }*/

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }


    public void getQnty(){
        if(edit_qnty.getText().toString().trim().equals("0"))
        edit_qnty.setText("");

    }
    static class ViewHolder {
        TextView prod_sl;
        TextView prod_code;
        TextView txtTitle;
        TextView txtDescription;
        TextView prod_uom;
        EditText prod_qnty,prod_price;
        TextWatcher qtyWatcher;
        TextWatcher priceWatcher;
        int ref;
    }

}

Please help me, With regards

Upvotes: 0

Views: 366

Answers (2)

blue dream
blue dream

Reputation: 101

This works for me !

if (holder.qtyWatcher != null) {
            holder.txtFourth.removeTextChangedListener(holder.qtyWatcher);
        }
       // Create the TextWatcher corresponding to this row
        holder.qtyWatcher = new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
                if(s.toString().equals("")||s.toString().equals("0")){
                    arrayproducts.get(position).setQnty("0");
                }
                else{
                    arrayproducts.get(position).setQnty(s.toString());
                }

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {}

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        };

Upvotes: 1

ams73
ams73

Reputation: 146

not sure that listview and recycleview can be used like this as they involve a recycling mechanism to reuse created views and rebind data from arrays or cursors as users scroll down/up to see more data. in other words, the row views created are with limited number to only fill the screen (with few extra from both sides) and they are recycled and reused to show data, if you insert a price or quantity for one product line, how the recycling process will rebind to show same data you inserted or show it on same position, I doubt this is possible.

I suggest that you restructure your application on parent/child base. show on list parent data, for example fixed product data, when users click one product line another screen opens so users insert new data, for example the price for that particular product line, the layout of your child screen will contains the edittext and any other data input views, in such case you need to integrate SQLite database so that you persist the new data provided by users.

hope this may provide you with some useful ideas to help you achieve your target.

Upvotes: 0

Related Questions