通常如果listview中的item內容有edittext的時候,會出現很多問題。
主要有1.點擊彈出編輯框,edittext會失去焦點。
2.輸入內容後,向下滑動因爲listview的item重用機制,你在上面輸入的內容下面的item也會顯示。
3.輸入內容後,向下滑動再拉回來原來的數據消失。
4.在需要爲edittext設置監聽時會出現卡的現象
下面我們直接代碼來說:
viewHolder.editText.setOnTouchListener(new OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction()==MotionEvent.ACTION_UP){
index=position;
}
return false;
}
});
viewHolder.editText.setOnFocusChangeListener(new OnFocusChangeListener() {
//設置焦點監聽,當獲取到焦點的時候纔給它設置內容變化監聽解決卡的問題
@Override
public void onFocusChange(View v, boolean hasFocus) {
EditText et=(EditText) v;
if(mWatcher==null){
mWatcher=new myWatcher();
}
if(hasFocus){
et.addTextChangedListener(mWatcher);//設置edittext內容監聽
}else {
et.removeTextChangedListener(mWatcher);
}
}
});
viewHolder.editText.clearFocus();//防止點擊以後彈出鍵盤,重新getview導致的焦點丟失
if (index != -1 && index == position) {
// 如果當前的行下標和點擊事件中保存的index一致,手動爲EditText設置焦點。
viewHolder.editText.requestFocus();
}
viewHolder.editText.setText(text[position]);//這一定要放在clearFocus()之後,否則最後輸入的內容在拉回來時會消失
viewHolder.editText.setSelection(viewHolder.editText.getText().length());
// viewHolder.editText.addTextChangedListener(new myWatcher());//放棄直接的爲每一個edittext設置監聽內容變化
class myWatcher implements TextWatcher{
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
text[index]=s.toString();//爲輸入的位置內容設置數組管理器,防止item重用機制導致的上下內容一樣的問題
}
}
源碼地址:http://download.csdn.net/detail/u013377714/9370685