android listview 含有edittext 数据错乱问题

项目中listview的每条item会有edittext时,当输入一个时,往下滚动,由于listview的复用机制,所以会出现数据错乱的现象,主要是通过设置edittext的tag,记录下当输入完数据时的position,从数组当中取出position,然后重新赋值处理,如下代码:

	// 适配器
	public class SellHedgeAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			if (sellMaps == null) {
				return 0;
			}
			return sellMaps.size();
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder viewHolder = null;
			if (convertView == null) {
				viewHolder = new ViewHolder();
				convertView = initViewHolder(viewHolder);
				convertView.setTag(viewHolder);
			} else {

				viewHolder = (ViewHolder) convertView.getTag();
				// 防止edit的数据被复用,需要设置一个标志,保存数据
				viewHolder.listview_item_edit.setTag(position);
			}
			refreshValue(position, viewHolder);
			return convertView;
		}

		private void refreshValue(final int position,
				final ViewHolder viewHolder) {

			hedge_inst_name.setText(instrName);

			viewHolder.ticket.setText(sellMaps.get(position)
					.get(HEDGE_TicketStr).toString());

			String d = DecimalUtil.formatAmount(Double.parseDouble((sellMaps
					.get(position).get(HEDGE_AMOUNT).toString())));
			viewHolder.amount.setText(d);

			digit = InstrumentUtil.getDigitByInstrument(instrName);
			double closePrice = Double.parseDouble(sellMaps.get(position)
					.get(HEDGE_CLOSEPIRCE).toString());
			viewHolder.closePrice.setText(DecimalUtil.formatDoubleParam(
					closePrice, digit));

			viewHolder.listview_item_edit.setTag(position);
			viewHolder.listview_item_edit.setText(left_edit_maps.get(position));
			// 为editText设置TextChangedListener,每次改变的值设置到hashMap
			// 我们要拿到里面的值根据position拿值
			viewHolder.listview_item_edit
					.addTextChangedListener(new 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) {
							int position = (Integer) viewHolder.listview_item_edit
									.getTag();
							// 将editText中改变的值设置的HashMap中
							left_edit_maps.put(position, s.toString());

						}
					});

		}

		private View initViewHolder(ViewHolder viewHolder) {
			View convertView;
			convertView = getActivity().getLayoutInflater().inflate(
					R.layout.activity_openposition_hedge_item, null);

			viewHolder.ticket = (TextView) convertView
					.findViewById(R.id.ticket);
			viewHolder.ticket.setTypeface(faceroman);

			viewHolder.amount = (TextView) convertView
					.findViewById(R.id.amount);
			viewHolder.amount.setTypeface(faceroman);

			viewHolder.closePrice = (TextView) convertView
					.findViewById(R.id.closePrice);
			viewHolder.closePrice.setTypeface(faceroman);

			viewHolder.listview_item_edit = (EditText) convertView
					.findViewById(R.id.listview_item_edit);

			return convertView;
		}
	}

	public class ViewHolder {

		TextView ticket;
		TextView amount;
		TextView closePrice;
		EditText listview_item_edit;

	}

感谢这位前辈的指点网址如下:http://www.bubuko.com/infodetail-359182.html,网上其他的解决方案太过于复杂,这个应该比较简单明了。

=======================分割线2016年4月20日17:26:55=====================================

当输入edittext之后,有时候发现光标跑到前面去了,所以需要重新设置得到焦点和改变值时的光标,代码如下:

viewHolder.listview_item_edit
					.addTextChangedListener(new 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) {
							// 使光標至於最後一位
							viewHolder.listview_item_edit
									.setSelection(viewHolder.listview_item_edit
											.getText().length());

							int position = (Integer) viewHolder.listview_item_edit
									.getTag();

							double selledit = getAmount(s.toString());
							// 将editText中改变的值设置的HashMap中
							sell_edit_maps.put(position, selledit + "");
							
							resetSellBuyCollUI();

						}
					});

			// 监听edittext取得焦点,将amout填入文本框
			viewHolder.listview_item_edit
					.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {
						@Override
						public void onFocusChange(View v, boolean hasFocus) {
							// 使光標至於最後一位
							viewHolder.listview_item_edit
									.setSelection(viewHolder.listview_item_edit
											.getText().length());

							String damoutStr = "";
							if (hasFocus) {
								int position = (Integer) viewHolder.listview_item_edit
										.getTag();
								if ((sell_edit_maps.get(position) != null)) {
									damoutStr = DecimalUtil.formatAmount(Double
											.parseDouble((sell_edit_maps
													.get(position).toString())));
								} else {
									damoutStr = DecimalUtil.formatAmount(Double
											.parseDouble((sellMaps
													.get(position).get(
															HEDGE_AMOUNT)
													.toString())));
								}

								// double damout = Double.parseDouble((sellMaps
								// .get(position).get(HEDGE_AMOUNT)
								// .toString()));
								viewHolder.listview_item_edit
										.setText(damoutStr);
							} else {
								// 此处为失去焦点时的处理内容
							}
						}
					});

		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值