2017-12-19 4 views
0

Ich bin kein Experte in Android-Listenansicht und Editiertext. Ich stecke jedoch mit einigen nervigen Problemen in diesem Zusammenhang fest. Ich hole Werte in listview ohne jedes Problem, aber wenn ich etwas in Edittext eingeben und scrollen Sie den Wert von herunter EditText ändert seine Position. Hier ist mein Code. // ProduktklasseListview mit edittext Wert verloren beim Scrollen

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;  } 

} 

Und hier ist der Adapter Klasse

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; 
    } 

} 

Bitte helfen Sie mir, Im Hinblick

Antwort

0

nicht sicher, dass Listview und recycleview kann wie folgt verwendet werden, da sie eine verwickeln Wiederverwendungsmechanismus, um erstellte Ansichten wiederzuverwenden und Daten von Arrays oder Cursorn neu zu binden, wenn Benutzer nach unten/oben blättern, um mehr Daten zu sehen. mit anderen Worten, die Zeilenansichten erstellt mit einer begrenzten Anzahl, um nur den Bildschirm (mit einigen zusätzlichen von beiden Seiten) zu füllen und sie werden recycelt und wiederverwendet, um Daten anzuzeigen, wenn Sie einen Preis oder eine Menge für eine Produktlinie einfügen, wie das Recycling Der Prozess wird erneut binden, um dieselben Daten anzuzeigen, die Sie eingefügt haben, oder Sie zeigen sie an derselben Position. Ich bezweifle, dass dies möglich ist.

Ich schlage vor, dass Sie Ihre Anwendung auf Eltern/Kind-Basis umstrukturieren. Zeigen Sie in der Liste übergeordnete Daten an, zum Beispiel feste Produktdaten, wenn Benutzer auf eine Produktlinie klicken, öffnet sich ein anderer Bildschirm, so dass Benutzer neue Daten einfügen, zum Beispiel den Preis für diese bestimmte Produktlinie, das Layout Ihres Kindbildschirms enthält den Editiertext und alle anderen Dateneingabeansichten, in diesem Fall müssen Sie die SQLite-Datenbank integrieren, damit Sie die neuen Daten beibehalten, die von Benutzern bereitgestellt werden.

hoffe, dass dies Ihnen einige nützliche Ideen liefern kann, die Ihnen helfen, Ihr Ziel zu erreichen.

0

Das funktioniert für mich!

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) {} 
     }; 
Verwandte Themen