ListView嵌套EditText 所遇到的一些冲突问题

因为项目需要,需要在list view里面嵌套Edittext,并且监听Edit Text里面的数字变化,更新提交按钮和取消按钮的颜色

list view填充数据就不多说了。

主要说一下EditText和list view的冲突问题,这里面有几个方法需要进一步去实现,看图:

OnClickListener,OnKeyListener,OnFocusChangeListener,OnTouchListener
这四个事件分别是点击事件,输入事件,焦点改变事件,触摸事件。
因为EditText嵌套在list view里面,焦点被list view一直占用着,所以在有的平板上。点击EditText系统默认的输入法是不会弹出来的,因为他获取不到焦点。这里就需要在list view的item布局的根布局里面设置属性

descendantFocusability="afterDescendants"

然后在触摸事件里面直接调用软键盘直接弹出,并通知EditText获取焦点
viewHandler.editText.setOnTouchListener(new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
((ViewGroup) v.getParent())
.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
v.requestFocus();
ShowKeyboard(v);
LogUtil.recordLog("触摸事件触发");
return false;
}
});
//显示虚拟键盘
public static void ShowKeyboard(View v)
{
InputMethodManager imm = ( InputMethodManager ) v.getContext().getSystemService( Context.INPUT_METHOD_SERVICE );

imm.showSoftInput(v,InputMethodManager.SHOW_FORCED);
}

//隐藏虚拟键盘
public static void HideKeyboard(View v)
{
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
}

class MyOnFocusChange implements View.OnFocusChangeListener{
int position;
EditText editText;

public MyOnFocusChange(int position,EditText editText) {
this.position = position;
this.editText = editText;
}

@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
editText.setHint("");
editText.setBackgroundResource(R.mipmap.sr);
}else {
if (editText.getText().toString().equals("")){
editText.setHint("0");
editText.setBackgroundResource(R.mipmap.srs);
}
}
}
}

class MyOnTextChange implements View.OnKeyListener{

int position;
EditText editText;
public MyOnTextChange(int position,EditText editText) {
this.position = position;
this.editText = editText;
}

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
LogUtil.recordLog("editText改变后:" + editText.getText().toString());
int num = 0 ;
if (editText.getText().toString().equals("")){
editText.setBackgroundResource(R.mipmap.srs);
list.get(position).setNumber("0");
}else{
num = editText.getText().length();
if (num>=4){
editText.setText("999");
HideKeyboard(editText);
}
editText.setBackgroundResource(R.mipmap.sr);
list.get(position).setNumber(editText.getText().toString());
}
LogUtil.recordLog(editText.getText().toString()+" aaaaaaaaaaaaaaaa");
//设置光标始终排在数字后面
editText.setSelection(editText.getText().length());
setBackgrounds();
return false;
}
}

//判断--设置--提交和取消的背景
private void setBackgrounds(){
int sum = 0;
for (int m = 0;m<list.size();m++){
int n = 0;
if (list.get(m).getNumber().toString().equals("")){
list.get(m).setNumber("0");
}
n = Integer.valueOf(list.get(m).getNumber().toString());
sum = sum + n;
LogUtil.recordLog("数据总和: "+sum);
}
if (sum==0){
cancelBtn.setBackgroundResource(R.color.blue_dans);
updateBtn.setBackgroundResource(R.color.blue_dans);
}else {
cancelBtn.setBackgroundResource(R.drawable.search_pressed);
updateBtn.setBackgroundResource(R.drawable.search_pressed);
}
}




posted @ 2016-10-08 10:50  杨钊丶  阅读(59)  评论(0)    收藏  举报