2014-03-27 56 views
0

我正在开发一个申请创建发票。用户必须添加项目列表并设置数量。数据被添加到listview.for我使用自定义列表适配器扩展基础适配器。对于第一个项目,如果用户选择数量为15(例如)为item.qty,如显示15直到下一个项目被添加。如果添加另一个,则将先前设置的数量更改为当前one.I使用addTextChangedListener里面的自定义列表适配器。当我更改qty使用addTextChangedListener受影响的所有行。我使用自定义适配器来填充列表视图。 ListView中的每一行都有3个文本视图(自定义布局)和一个用于输入数量的编辑文本。另一个问题是滚动ListView时,该值会在编辑文本中自动重复/更改。为什么? enter image description here在列表视图中的addTextChangedListener使用自定义列表适配器

enter image description here

这里是我的主类,

public class SalesTransactionFragment extends SherlockFragment { 
    Button b1,b2,b3; 
    TextView tvcusid,tvcusname,tvtotal; 
    ListView lv; 
    public static itemlistadapter itadapter; 
    static ArrayList<Items> item ; 
    Items it; 

    String cus_id,c_name; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // Get the view from fragmenttab3.xml 
      View view = inflater.inflate(R.layout.salesform, container, false); 
      return view; 

    } 

    @Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onActivityCreated(savedInstanceState); 
    b1=(Button) getActivity().findViewById(R.id.sfbtncus); 
    b2=(Button) getActivity().findViewById(R.id.sfbtnadd); 
    b3=(Button) getActivity().findViewById(R.id.sfbtfinish); 
    itadapter=null; 
    it=new Items(); 
    tvcusid=(TextView) getActivity().findViewById(R.id.sftvcusid); 
    tvcusname=(TextView) getActivity().findViewById(R.id.sftvcusname); 
    tvtotal=(TextView) getActivity().findViewById(R.id.sftotal); 
    lv=(ListView) getActivity().findViewById(R.id.sflvitem); 
    lv.setTranscriptMode(lv.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
    item = new ArrayList<Items>(); 

    b1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(getActivity(), CustomerSelect.class); 
      startActivityForResult(i, 1); 
//   Intent i = new Intent(SalesFormActivity.this, CustomerSelect.class); 
//   i.putExtra("cussel", "true"); 
//   startActivityForResult(i, 0); 
     // Toast.makeText(getActivity(), "CustomerSelect",Toast.LENGTH_LONG).show(); 
     } 
    }); 
    b2.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
//   
      Intent i = new Intent(getActivity(), ItemsView.class); 
      startActivityForResult(i, 0);   
//   Toast.makeText(getActivity(), "AddItem",Toast.LENGTH_LONG).show(); 

     } 
    }); 
    b3.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     // Toast.makeText(getActivity(), "Finish",Toast.LENGTH_LONG).show(); 

      if(itadapter==null) 
       { 
         Toast.makeText(getActivity(), "Must select a item", Toast.LENGTH_LONG).show(); 

       } 
     else if(cus_id!=null&&itadapter!=null){ 
       Intent i=new Intent(getActivity(), Invoice.class); 
      i.putExtra("cus_id", cus_id); 

       i.putExtra("c_name", c_name); 

       startActivity(i); 
//    getActivity().finish(); 

      } 
      else if (cus_id==null) 
      { 
       Toast.makeText(getActivity(), "Must select a customer", Toast.LENGTH_LONG).show(); 
      } 




     } 
    }); 
} 
    @Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(data!=null) 
    switch (requestCode) { 
//  case 0: 
//   cus_id=data.getStringExtra("cus_id"); 
//   c_name=data.getStringExtra("c_name"); 
//   tvcusid.setText(cus_id); 
//   tvcusname.setText(c_name); 
//   
//   break; 
    case 0: 
     it=new Items(); 
     it.setitemname(data.getStringExtra("name")); 
     it.setprice(data.getDoubleExtra("price",0)); 
     it.setid(data.getIntExtra("item_id", 0)); 
     if(itadapter==null){ 
      item.add(it); 
      itadapter=new itemlistadapter(item, getActivity()); 
      lv.setAdapter(itadapter); 
      lv.setSelection(itadapter.getCount()-1); 

     }else{ 

      itadapter.addItems(it); 
     } 
     if(itadapter!=null){ 
      tvtotal.setText(""+itadapter.gettotal()); 
     } 
     break; 
    case 1: 
     cus_id=data.getStringExtra("cusid"); 
     c_name=data.getStringExtra("cusname"); 
     tvcusid.setText(cus_id); 
     tvcusname.setText(c_name); 

     break; 
    default: 
     break; 
    } 


    } 
    @Override 
public void onResume() { 
    super.onResume(); 
} 

这里是适配器类,

public class itemlistadapter extends BaseAdapter implements Filterable { 

    ArrayList<Items> item; 
    ArrayList<Items> history; 
    HashMap<Integer, Double> prices; 
    Context con; 
    double grantTotal = 0; 

    public itemlistadapter(ArrayList<Items> item, Context con) { 
     super(); 
     this.item = item; 
     this.con = con; 
     history = (ArrayList<Items>) item.clone(); 
     prices = new HashMap<Integer, Double>(); 
    } 

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

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater lvinflat = (LayoutInflater) con 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = lvinflat.inflate(R.layout.singlesalelist, parent, 
        false); 
     } 
     final int pos = position; 
     final TextView tvitem = (TextView) convertView 
       .findViewById(R.id.sinlvtvname); 
     final TextView price = (TextView) convertView 
       .findViewById(R.id.sinlvtvprice); 

     final EditText qty = (EditText) convertView 
       .findViewById(R.id.sinlvetqty); 
     if (pos == item.size() - 1) { 
      // Log.d("focusposition", 
      // ""+pos+"qty.requestFocus()"+qty.requestFocus()); 
      qty.requestFocus(); 
     } 
     final TextView tvtotal = (TextView) convertView 
       .findViewById(R.id.sinlvtvtotal); 
     tvitem.setText(item.get(position).getitemname()); 

     price.setText("" + item.get(position).getprice()); 

     qty.setText("" + item.get(pos).getqty()); 
     Log.d("position", "" + pos + "qty" + item.get(position).getqty()); 

//  if (qty.length() != 0) { 
//   int qnty = Integer.parseInt(qty.getText().toString()); 
//  // item.get(pos).setqty(qnty); 
//  // Log.d("positionqty.length() != 0:", ""+pos+"qty"+item.get(position).getqty()); 
// 
//   double unitp = Double.parseDouble(price.getText().toString()); 
//   double total = (qnty * unitp); 
//   tvtotal.setText("" + total); 
//   prices.put(pos, total); 
//  } else { 
// 
//   tvtotal.setText("" + 0); 
//  } 
     qty.addTextChangedListener(new TextWatcher() { 

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

       Log.d("On text changed", s+",Start:"+start+",count:"+count+",before:"+before); 
       if (s.length() != 0) { 
        int qnty = Integer.parseInt(s.toString()); 
        item.get(pos).setqty(qnty); 
        Log.d("position in ChangedListener", ""+pos+"qty"+item.get(pos).getqty()+"qnty"+qnty); 

        double unitp = Double.parseDouble(price.getText() 
          .toString()); 
        double total = (qnty * unitp); 
        tvtotal.setText("" + total); 
        prices.put(pos, total); 
       } else { 

        tvtotal.setText("" + 0); 
       } 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       Log.d("Before text changed", s+",Start:"+start+",count:"+count+",after:"+after); 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

       Log.d("After text changed", s+""); 
      } 
     }); 

     if (tvtotal.getText().equals("total")||tvtotal.getText().equals("Total")) 
      tvtotal.setText(price.getText()); 
     try{ 
     prices.put(pos, Double.parseDouble(tvtotal.getText().toString())); 
     }catch(NumberFormatException e){ 
      //TODO 
     } 
     return convertView; 
    } 

    public void addItems(Items i) { 
     item.add(i); 
     notifyDataSetChanged(); 
    } 

    public ArrayList<Items> getItems() { 
     return item; 
    } 

    public double gettotal() { 
     grantTotal = 0; 
     for (int i = 0; i < prices.size(); i++) { 
      grantTotal += prices.get(i); 
     } 
     return grantTotal; 
    } 

    Filter my_filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      item = (ArrayList<Items>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 

     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      Log.d("insitefilterresults", "msg"); 
      FilterResults filter_results = new FilterResults(); 
      ArrayList<Items> arr = new ArrayList<Items>(); 
      if (constraint != null && history != null) { 
       for (Items s : history) { 
        if (s.getitemname().startsWith(constraint.toString())) 
         arr.add(s); 
       } 
       filter_results.values = arr; 
       filter_results.count = arr.size(); 
      } 
      return filter_results; 
     } 
    }; 

    @Override 
    public Filter getFilter() { 
     Log.d("insitegetFilte", "msg"); 

     // TODO Auto-generated method stub 
     return my_filter; 
    } 

} 

logcat的是,

03-27 05:18:57.692: D/Before text changed(409): 1,Start:1,count:0,after:1 
03-27 05:18:57.692: D/Before text changed(409): 1,Start:1,count:0,after:1 
03-27 05:18:57.702: D/On text changed(409): 15,Start:1,count:1,before:0 
03-27 05:18:57.702: D/position in ChangedListener(409): 0qty15qnty15 
03-27 05:18:57.722: D/On text changed(409): 15,Start:1,count:1,before:0 
03-27 05:18:57.732: D/position in ChangedListener(409): 1qty15qnty15 
03-27 05:18:57.742: D/After text changed(409): 15 
03-27 05:18:57.742: D/After text changed(409): 15 

请帮我解决这个。帮助将不胜感激。提前感谢。

+0

那么,有什么问题? – eleven

+0

滚动列表视图时数值发生变化 – Noufal

回答

0

我认为这不是一个问题,我觉得你有那么当你在那个时间计算在你的文字看守的东西,所以你必须 更新ArrayList的数据到新的计算了所有数据的数组列表数据你只使用更新用看跌功能东阳你知道位置值 这就是你,当你改变值够

0

qty.addTextChangedListenerprices.put(pos, total);

添加这段代码更新每次。

((BaseAdapter) lv.getAdapter()).notifyDataSetChanged();

+0

lv无法在适配器类中访问 – Noufal

+0

@Noufal改变'ListView lv;'改为'公共ListView lv;' – VenomVendor

+0

当我按照你的说法。在第三个位置改变数量。同时,第一个位置的数量同时改变为第三个条目 – Noufal

相关问题