項目需求:列表展示數據,同時可以修改,保存編輯過的數據(編輯某個數據時背景加深)。
問題1:當訪問數據庫,下載數據后使用adapter展示后,由於item中包含EditText,點擊某一個EditText,該EditText獲得焦點,光標顯示,此時滾動listview會發現光標也會跑到別的item的EditText控件里面。
解決方案:在listview的onScrollChangedListener里面設置listview滾動時,listview.requestfocus().
問題2:編輯某EditText要求背景加深
解決方案:給item的每個EditText設置onFocusChangedListener,一旦獲取焦點,就將背景加深,失去焦點,還原背景
問題3:滾動listview時會發現某些item中的EditText並沒有獲得焦點但是的背景加深
解決方案:這是由於convertView復用導致的,在getview方法中if(convertView!=null){}else{//在這里恢復未編輯狀態}。
問題4:問題1,2解決后發現編輯某EditText時如果滾動listview后,正在編輯的EditText再次回到可視區域時,怎么背景加深
解決方案:(如有更好方法,不吝賜教)在EditText獲取到焦點時使用listview.setTag(int key,Object value);
listview.setTag(R.id.TAG,tag);
listview.setTag(R.id.POSITION,position);
最后在listview的onScrollChangedListener的onScrollChanged中判斷position是否可視,如果可視,則通過tag和position獲取到EditText,editText.setBackground(為什么不editText.requestFocus()??實踐證明當使用editText.requestFocus后,listview滾動時光標亂跑的問題又出來了)。
問題5:問題4解決后,衍生出來的問題就是,listview滾動后,edittext再次回到可視界面,設置背景加深后,如果此時點擊別的EditText,那么上一個edittext的背景還是加深狀態
解決方案:在onFocusChangedListener方法中,先獲取到該EditText(通過listview.getTag(key)),設置背景初始。
問題6:項目需求不同EditText需要使用不同的自定義鍵盤,每次鍵盤彈出后選中的EditText會失去焦點
解決方案:鍵盤彈出后布局發生變化,會重新執行getView方法,所以在getView方法中判斷是否之前有選中EditText(通過listview.getTag(key),獲取到之前的EditText),如有,則背景加深。
問題7:EditText編輯后,listview滾動后,原先編輯的數據不見了
解決方案:在EditText的OnFocusChangedListener中判斷Edittext的內容有沒有變化,如有變化則將adapter的list更新。
問題8:不同的item,不同的EditText編輯后,怎么保存
解決方案:新建一個List<Map<String,String>>通過鍵值對區分不同的EditText(這與數據庫的設計還是有關系的)。
