在ListView中修改EditText的值

来源:互联网 发布:js 运行时未定义变量 编辑:程序博客网 时间:2024/06/05 03:37

http://www.lxway.com/500522011.htm


由于ViewHolder的复用机制,所有当ListView修改EditText的时候,会出现修改完后的值变唯有设定的值,解决问题的思路:
1.为我们的EditText设定一个标记。
holder.ActualNum.setTag(position); // 为输入框设定标签,防止修改时错乱

2.为EditText设定一个Touch事件监听,获取到对应的position
  holder.ActualNum.setOnTouchListener(new View.OnTouchListener() {    @Override    public boolean onTouch(View v, MotionEvent event) {     // TODO Auto-generated method stub     if (event.getAction() == MotionEvent.ACTION_UP) {      index = (Integer) v.getTag();      Log.i("0302", "onTouch"+index);     }     return false;    }   });
3.对EditText的输入转态进行监听,编写一个类实现TextWatcher接口
 class MyTextWatcher implements TextWatcher {    private ViewHolder mHolder;    public MyTextWatcher(ViewHolder holder) {     Log.i("0302", "构造函数TextWatcher");     mHolder = holder;    }    @Override    public void beforeTextChanged(CharSequence s, int start,      int count, int after) {     // TODO Auto-generated method stub    }    @Override    public void onTextChanged(CharSequence s, int start,      int before, int count) {     // TODO Auto-generated method stub    }    @Override    public void afterTextChanged(Editable s) {     // TODO Auto-generated method stub     if (s != null && !"".equals(s)) {      int position = (Integer) mHolder.ActualNum.getTag();      Log.i("0302", "EditText的标记:" + position);      mMaterialList.get(position).setActualNum(s.toString());    //获得以及标记的EditText的下标,并且改变其数据源的值     }    }   }

4.最后就是实现EditText的监听
holder.ActualNum.addTextChangedListener(new MyTextWatcher(holder));
以上几个步骤可以实现ListView中修改EditText的值,Adapter的源码如下:
package com.infok.adapter;import java.util.List;import android.content.Context;import android.graphics.Color;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.TextView;import com.example.vsee.R;import com.infok.custom_view.RoundButton;import com.infok.model.MaterialEntity;/ * @Title: ReceiveMaterialAdapter.java * @author FANG * @Description: 收货适配器 * @date 2015-2-28 下午2:03:36 */public class ReceiveMaterialAdapter extends BaseAdapter { private LayoutInflater inflater; private ViewHolder holder; private List<MaterialEntity> mMaterialList; public ReceiveMaterialAdapter(Context context,   List<MaterialEntity> mMaterialList) {  this.mMaterialList = mMaterialList;  inflater = LayoutInflater.from(context); } @Override public int getCount() {  // TODO Auto-generated method stub  return mMaterialList.size(); } @Override public Object getItem(int position) {  // TODO Auto-generated method stub  return mMaterialList.get(position); } @Override public long getItemId(int position) {  // TODO Auto-generated method stub  return position; } private Integer index = -1; @Override public View getView(int position, View convertView, ViewGroup parent) {  // TODO Auto-generated method stub  if (convertView == null) {   holder = new ViewHolder();   convertView = inflater.inflate(R.layout.listitem_receive_material,     null);   holder.mRoundButton = (RoundButton) convertView     .findViewById(R.id.roundButton);   holder.mMaterialNo = (TextView) convertView     .findViewById(R.id.listitem_material_no);   holder.purchaseNum = (TextView) convertView     .findViewById(R.id.listitem_purchase_num);   holder.ActualNum = (EditText) convertView     .findViewById(R.id.listitem_actual_num);   holder.ActualNum.setTag(position); // 为输入框设定标签,防止修改时错乱   holder.ActualNum.setOnTouchListener(new View.OnTouchListener() {    @Override    public boolean onTouch(View v, MotionEvent event) {     // TODO Auto-generated method stub     if (event.getAction() == MotionEvent.ACTION_UP) {      index = (Integer) v.getTag();      Log.i("0302", "onTouch"+index);     }     return false;    }   });   class MyTextWatcher implements TextWatcher {    private ViewHolder mHolder;    public MyTextWatcher(ViewHolder holder) {     Log.i("0302", "构造函数TextWatcher");     mHolder = holder;    }    @Override    public void beforeTextChanged(CharSequence s, int start,      int count, int after) {     // TODO Auto-generated method stub    }    @Override    public void onTextChanged(CharSequence s, int start,      int before, int count) {     // TODO Auto-generated method stub    }    @Override    public void afterTextChanged(Editable s) {     // TODO Auto-generated method stub     if (s != null && !"".equals(s)) {      int position = (Integer) mHolder.ActualNum.getTag();      Log.i("0302", "EditText的标记:" + position);      mMaterialList.get(position).setActualNum(s.toString());     }    }   }   holder.ActualNum.addTextChangedListener(new MyTextWatcher(holder));   holder.mLayout = (LinearLayout) convertView     .findViewById(R.id.listitem_backround_linearlayout);   convertView.setTag(holder);  } else {   holder = (ViewHolder) convertView.getTag();   holder.ActualNum.setTag(position);  }  if (position % 2 == 0) { // 偶数数的时候设置背景   holder.mLayout.setBackgroundResource(R.color.listitem2);  } else { // 奇数的时候设置背景   holder.mLayout.setBackgroundResource(R.color.listitem1);       //相邻的两条Item的背景颜色不同  }  final MaterialEntity material = mMaterialList.get(position);  holder.mMaterialNo.setText(material.getMaterialNo());  holder.purchaseNum.setText(material.getPurchaseNum());  holder.ActualNum.setText(material.getActualNum());  holder.mRoundButton.setButtonText(material.getColor());  holder.mRoundButton.setButtonBackground(Color.RED);  return convertView; } private class ViewHolder {  private RoundButton mRoundButton;  private TextView mMaterialNo, purchaseNum;  private EditText ActualNum;  private LinearLayout mLayout; }}

0 0
原创粉丝点击