android listview 含有edittext 数据错乱问题

来源:互联网 发布:python 字典嵌套 list 编辑:程序博客网 时间:2024/05/16 05:08

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

// 适配器public class SellHedgeAdapter extends BaseAdapter {@Overridepublic int getCount() {if (sellMaps == null) {return 0;}return sellMaps.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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() {@Overridepublic void onTextChanged(CharSequence s, int start,int before, int count) {}@Overridepublic void beforeTextChanged(CharSequence s,int start, int count, int after) {}@Overridepublic 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() {@Overridepublic void onTextChanged(CharSequence s, int start,int before, int count) {}@Overridepublic void beforeTextChanged(CharSequence s,int start, int count, int after) {}@Overridepublic 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() {@Overridepublic 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 {// 此处为失去焦点时的处理内容}}});}


0 0
原创粉丝点击