一般情况下ListView用来显示数据的,很少用来修改的数据的。但是,一旦遇到这种怪异的需求,我们也得想办法解决。接下来跟大家介绍一种ListView修改数据,并且
不会出现窜行的情况。
由于我们在ListView中修改数据时,没有确定按钮。因此要想数据修改成功,需要借助于TextChanged事件,在afterTextChanged方法中更新ListView中的Adapter list中数据。
如果控制不好就会出现窜行的情况。因此问题的关键是TextChanged事件实在何处添加,怎么添加,是问题的核心。先看Adapter代码。
package com.example.listviewdemo;
import java.util.List;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.TextView;
public class MyAdapter extends ArrayAdapter<Goods> {
private int mLayoutID;
public MyAdapter(Context context, int resource, List<Goods> objects) {
super(context, resource, objects);
this.mLayoutID = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Goods goods = getItem(position);
View vw = null;
ViewHolder holder = null;
if (convertView == null){
vw = LayoutInflater.from(getContext()).inflate(R.layout.item, null);
holder = new ViewHolder();
holder.tvGoodsName = (TextView) vw.findViewById(R.id.tv_goods_name);
holder.etBuyNumber = (EditText) vw.findViewById(R.id.et_buy_number);
<span style="white-space:pre"> </span>// 如果只是在这个地方添加的话,同样出现窜行
<span style="white-space:pre"> </span>holder.watcher = new EtTextChanged(position);
holder.etBuyNumber.addTextChangedListener(holder.watcher);
vw.setTag(holder);
}else{
vw = convertView;
holder = (ViewHolder) vw.getTag();
}
holder.watcher.setPosition(position);
holder.tvGoodsName.setText(goods.getGoodsName());
holder.etBuyNumber.setText(goods.getBuyNumber() + "");
return vw;
}
class ViewHolder{
TextView tvGoodsName;
EditText etBuyNumber;
EtTextChanged watcher;
}
class EtTextChanged implements TextWatcher{
private int position;
public EtTextChanged(int position){
this.position = position;
}
public void setPosition(int position) {
this.position = position;
}
@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) {
Goods goods = getItem(position);
String strNumber = goods.getBuyNumber() + "";
if (!strNumber.equals(s.toString().trim())){
int number = Integer.parseInt(s.toString().trim());
goods.setBuyNumber(number);
}
}
}
}
上边的代码非常巧妙的解决ListView里边EditText输入窜行的情况。
问题想清楚了,就显得非常简单。
代码下载地址:点击打开链接