2015-05-29 72 views
1

我希望列表视图有2个edittext来保存值,即使在滚动后变为不可见也是如此。当edittext损失集中时,我希望每个edittext值都保存在一个数组列表中(数组列表 - 一个用于数量级,一个用于价格),我可以保存到数据库中。 我试过OntextChanegd方法中的代码,但它看起来不正确。列表视图edittext数据在Android中滚动丢失

public class CustomAdapter extends BaseAdapter { 
ArrayList<String> names; 
Context context; 
ArrayList<String> itemPrices = new ArrayList<>(); 
ArrayList<String> quantities = new ArrayList<>(); 

CustomAdapter(ArrayList v, Context c) { 
    names = v; 
    context = c; 
} 

@Override 
public int getCount() { 
    return names.size(); 
} 

@Override 
public Object getItem(int position) { 
    return names.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

    try { 
     final ViewHolder holder; 
     // TODO Auto-generated method stub 
     if (convertView == null) { 
      holder = new ViewHolder(); 

      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.row, null); 

      holder.textView = (TextView) convertView.findViewById(R.id.rowText); 
      holder.editQty = (EditText) convertView.findViewById(R.id.qty); 
      holder.editprice = (EditText) convertView.findViewById(R.id.price); 
      holder.textView.setTextSize(20); 
      holder.textView.setTextColor(Color.BLACK); 

      convertView.setTag(holder); 

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

     holder.textView.setText(names.get(position)); 
     holder.editQty.setHint("Quantity"); 
     holder.editprice.setHint("Price"); 
     holder.editQty.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 
     holder.editprice.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 



     return convertView; 
    }catch (NumberFormatException ex){ 
     Toast.makeText(context,"!!!",Toast.LENGTH_SHORT).show(); 
     ex.printStackTrace(); 
    } 


    return convertView; 
} 




private class ViewHolder { 
    TextView textView; 
    EditText editQty; 
    EditText editprice; 

    int ref; 
} 

}

回答

3

添加监听到ViewHolder

private class ViewHolder { 
     TextView textView; 
     EditText editQty; 
     EditText editprice; 
     TextWatcher qtyWatcher; 
     TextWatcher priceWatcher; 
     int ref; 
    } 

现在在getView()方法去除的EditText现有的手表,然后更新中的EditText文字和设定新的观察家。

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

    try { 
     final ViewHolder holder; 
     // TODO Auto-generated method stub 
     if (convertView == null) { 
      holder = new ViewHolder(); 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.row, null); 

     holder.textView = (TextView) convertView.findViewById(R.id.rowText); 
     holder.editQty = (EditText) convertView.findViewById(R.id.qty); 
     holder.editprice = (EditText) convertView.findViewById(R.id.price); 
     holder.textView.setTextSize(20); 
     holder.textView.setTextColor(Color.BLACK); 

     convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.ref = position; 
     if (holder.qtyWatcher != null) { 
      holder.editQty.removeTextChangedListener(holder.qtyWatcher); 
     } 
     if (holder.priceWatcher != null) { 
      holder.editprice.removeTextChangedListener(holder.priceWatcher); 
     } 
     holder.textView.setText(names.get(position)); 
     holder.editQty.setHint("Quantity"); 
     holder.editprice.setHint("Price"); 
     if(position<quantities.size()) 
      holder.editQty.setText(quantities.get(position)); 
     else 
      holder.editQty.setText(""); 
     if(position<itemPrices.size()) 
      holder.editprice.setText(itemPrices.get(position)); 
     else 
      holder.editprice.setText(""); 
     holder.qtyWatcher = new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
      } 

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

      @Override 
      public void afterTextChanged(Editable s) { 
       //Update the quantity 
      } 
     }; 
     holder.editQty.addTextChangedListener(holder.qtyWatcher); 
     holder.priceWatcher = new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
      } 

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

      @Override 
      public void afterTextChanged(Editable s) { 
       //Update you price 
      } 
     }; 
     holder.editprice.addTextChangedListener(holder.priceWatcher); 

     return convertView; 
    } catch (NumberFormatException ex) { 
     Toast.makeText(context, "!!!", Toast.LENGTH_SHORT).show(); 
     ex.printStackTrace(); 
    } 
    return convertView; 
} 
+0

这会工作考虑失去在滚动过程中发生的? – Abhijith

+0

holder.editQty.setText(quantities.get(position)); holder.editprice.setText(itemPrices.get(position)); 在上面的代码崩溃 – Abhijith

+0

更新后的帖子看看。 错误,因为我有初始化编辑文本。 @Abhijith – Kartheek

1

你需要对更新值保存到你的数据阵列,因为列表中使用循环视图。

holder.editQty.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      name.setValue(s); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
+0

不应该我在文本后改变方法吗? – Abhijith

+0

ok,nop。我刚刚设置了示例,如何存储。你在文本改变方法 –

+0

你能看看这个吗? http://stackoverflow.com/questions/30479562/android-view-view-and-roid-view-view-findviewbyidint 这就是我想要做的 – Abhijith

相关问题