Android開發ListView中包含EditText控件遇到的問題

      通常如果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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章