笔记104--ListView+EditText

ExpandableListView+RadioButton+EditText问题:解决方法稍微不同于ListView+RadioButton+EditText,首先,需要一个list来保存RadioButton的值;然后,对于RadioButton要设置onClickListener方法,来更改list中保存的值,而不能用onCheckedChangeListener。

对于和EditText复用的情况,首先你需要去掉ViewHolder,即ExpandableListview的优化,然后可以在EditText的onTouchListener中监听,当触摸了EditText就允许EditText的addTextChangedListener赋值,否则不允许。


1、现象描述

当ListView的item中包含EditText时,你会发现EditText的值会随着ListView的滚动而乱跑。

2、解决方案

1)你需要去掉ListView的优化。很重要,不信试试。

2)你需要判断下当EditText的值变化时,是不是由于setText()调用引起的.

public class Adapter extends BaseAdapter{

	/*
	 * 保存EditText的值
	 */
	private Map<Integer, String> map = new HashMap<Integer, String>();
	/*
	 * 判断是否由于调用setText()而引起EditText的值变化
	 */
	private boolean isSetText = false;

	@Override
	public int getCount() {
		return 20;
	}

	@Override
	public Object getItem(int position) {
		return null;
	}

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

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {

		final EditText et;

		convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_et, null);
		et = (EditText) convertView.findViewById(R.id.et);

		class MyTextWatcher implements TextWatcher{

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

			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			@Override
			public void afterTextChanged(Editable s) {

				//如果由于调用setText()而执行此方法,则不给map设置。
				if(isSetText){
					isSetText =false;
					return;
				}
				map.put(position, s.toString());
				System.out.println("---"+s.toString()+"---pos:"+et.getTag());
			}
		}

		et.addTextChangedListener(new MyTextWatcher());

		if(map.get(position) != null){
			System.out.println("--------"+position);
			isSetText = true;
			et.setText(map.get(position));
		}
		return convertView;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值