问题:
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