您的位置:首页 > 移动开发 > Android开发

android listview 含有edittext 数据错乱问题

2016-03-30 10:43 399 查看
项目中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 {
// 此处为失去焦点时的处理内容
}
}
});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: