android listview 含有edittext 数据错乱问题
2016-03-30 10:43
399 查看
项目中listview的每条item会有edittext时,当输入一个时,往下滚动,由于listview的复用机制,所以会出现数据错乱的现象,主要是通过设置edittext的tag,记录下当输入完数据时的position,从数组当中取出position,然后重新赋值处理,如下代码:
感谢这位前辈的指点网址如下: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 {
// 此处为失去焦点时的处理内容
}
}
});
}
// 适配器 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 {
// 此处为失去焦点时的处理内容
}
}
});
}
相关文章推荐
- Android学习系列(39)--Android主题和样式之系统篇(上)
- source not found-Note:This element has not attached解决办法
- Android 中的 Service 全面总结详解【下】
- Android ViewGroup事件分发机制
- android EditText设置只能输入金额
- Android LayoutInflater详解
- Android Bitmap面面观
- source insight 工程窗口的嵌入停靠
- Android 为应用程序创建桌面快捷方式
- Android.mk
- Android--activity获取返回值
- android中如何判断edittext中数据为空?
- Android开发坑之Jpush篇
- android graphic(17)—Using direct textures on Android
- 自定义Dialog设置setCancelable
- Android的软引用和弱引用
- Android三种实现定时器的方法
- Android 学习笔记
- Android TextView 跑马灯效果和 EditText 冲突
- 【转】Android BitmapShader 实战 实现圆形、圆角图片