给ListView每个Item添加EditText,输入数据不窜行

一般情况下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输入窜行的情况。


问题想清楚了,就显得非常简单。

代码下载地址:点击打开链接











  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值