關於在ListView中的EditText 問題 網上真的是一大堆一大堆的 裏面具體細節我沒去細扣研究,如果我現在做android開發我一定花時間自己封裝個可以ListView中 放的EditText ,這些都是題外話了,我這裏是要說的 在ListView中放EditText 根據Hashmap 來確定對應位置上的值 需要注意的一些問題
我來總結下 主要的問題
- EditText 的afterTextChanged(Editable s)方法中的判空問題(不要加判空)
- hashMap.get(position)的判空問題(一定要有判空後的處理)
- EditText 修改完後 更新Adapter 不刷新EditText控件問題
1和2 都可以避免掉 3想了個折中的方法
下面來敘述下現象
1的現象就是如果EditText裏面是1位的比如:
- EditText中是1 你改成2 這種情況正常
- EditText中是1 你刪掉它就是改爲”” 那樣就錯了 刪不掉的
1的現象就是如果EditText裏面是2位的或者2位以上 用2位做例子比如:
- EditText中是11 你改成33 這種情況正常
- EditText中是11 你改成3 這種情況錯誤 實際上得到的是13
- EditText中是11 你刪掉它就是改爲” 這種情況錯誤 實際上得到的是1
2的現象 如果你沒有判空後的處理那樣 1的現象 中的 改爲”” 沒有改掉的現象仍然存在
3的現象 解決方法是 更新不了adapter 那就只能刷新整個頁面了(這個我沒有去嘗試) 或者銷燬這個頁面在重新進來 我是銷燬重新進來的
因爲我這個頁面只有ListView 並且我的ListView沒有加刷新控件
代碼如下:
@Override
public void initDataAndAdapterToView() {
AppUtils.getInstance().showLoading(EditPoleNumActivity.this, "修改中....");
mWifiAdmin = new WifiAdmin(this);
hashMap = new HashMap<Integer, String>();
mPoleDatas = new ArrayList<>();
mAdapter = new CommonAdapter<PoleData>(this, mPoleDatas, R.layout.list_item_edit_pole) {
@Override
public void convertGetView(final ViewHolder viewHolder, final PoleData item) {
TextView textView = (TextView) viewHolder.getView(R.id.txt_old_num);
textView.setText(item.getPoleNumber());
EditText editText = (EditText) viewHolder.getView(R.id.edi_new_num);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
//將editText中改變的值設置的HashMap中
hashMap.put(viewHolder.getPosition(), s.toString());
}
});
if (!TextUtils.isEmpty(hashMap.get(viewHolder.getPosition()))) {
editText.setText(hashMap.get(viewHolder.getPosition()));
mPoleDatas.get(viewHolder.getPosition()).setNewPoleNum(hashMap.get(viewHolder.getPosition()));
}else {
mPoleDatas.get(viewHolder.getPosition()).setNewPoleNum("");
}
}
};
mListEditPole.setAdapter(mAdapter);
mEditPoleThread = new EditPoleThread();
mEditPoleThread.start();
}