ListView+EditText失去焦点和软键盘问题解决办法

时间:2021-02-27 19:38:30

问题:

EditText要求输入数字,点击之后,getview()这个方法再次被执行,软键盘从数字很快变成普通键盘,并且失去焦点。


原因:

软键盘弹出式,listview被重新绘制。


解决方法:

1. 重新绘制之前,记录下焦点位置;

2. 绘制完成之后,重新获取焦点;


栗子(项目中用到的):

public class OrderTotalDetailListAdapter extends BaseAdapter {
private ArrayList<OrderTotal> orderList = new ArrayList<OrderTotal>();

public OrderTotalDetailListAdapter(int product_id) {
orderList = OrderTotalDAO.getOrderTotalList(product_id);
}

@Override
public int getCount() {
return orderList.size();
}

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

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

@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
OrderTotal orderTotal = (OrderTotal) getItem(position);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.order_detail_4_sine_item, null);
}
((OrderTotalDetailView)convertView).setValue(orderTotal, position);
return convertView;
}

}

public class OrderTotalDetailView extends LinearLayout {
private EditText real_volume;
private OrderTotal orderTotal;

private int index = -1;

public OrderTotalDetailView(Context context) {
super(context);
}

public OrderTotalDetailView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@SuppressLint("ClickableViewAccessibility")
public void setValue(OrderTotal _orderTotal, final int position) {
this.orderTotal = _orderTotal;
if (real_volume == null) {
real_volume = (EditText) findViewById(R.id.real_volume);
}
pop_name.setText(orderTotal.getPop());
pred_volume.setText(orderTotal.getPred_volume() + "");
real_volume.setText(orderTotal.getReal_volume() + "");

real_volume.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// 在TOUCH的UP事件中,要保存当前的行下标,因为弹出软键盘后,整个画面会被重画
// 在getView方法的最后,要根据index和当前的行下标手动为EditText设置焦点
index = position;
}
return false;
}
});

real_volume.addTextChangedListener(new TextWatcher() {

private String preValue = "";
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (preValue.equals(s.toString())) {
return;
}
orderTotal.setReal_volume(Integer.parseInt(s.toString()));
OrderTotalDAO.updateOrdersTotalVolume(orderTotal);
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
preValue = s.toString();
}

@Override
public void afterTextChanged(Editable s) {

}
});

real_volume.clearFocus();
// 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。
if(index!= -1 && index == position) {
real_volume.requestFocus();
}
// 焦点移到最后
real_volume.setSelection(real_volume.getText().length());
}

}


参考:

http://blog.csdn.net/l_serein/article/details/7517011

http://www.tuicool.com/articles/MNFFna