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