效果圖:
界面:MainActivity 一個listview item 一個EditText
軟鍵盤問題:清單檔案添加 windowSoftInputMode="adjustPan"
焦點複用,内容沖突:見代碼注釋
核心代碼:
public class MainActivity extends AppCompatActivity {
private ListView listView;
private HashMap<Integer, String> hashMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
initView();
}
private void initView() {
listView = (ListView) findViewById(R.id.listView);
hashMap = new HashMap<>();
listView.setAdapter(new MyAdapter());
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return 50;
}
@Override
public Object getItem(int position) {
return hashMap.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//初始化控件,擷取輸入框控件
if(convertView == null){
convertView = View.inflate(getApplicationContext(),R.layout.item,null);
}
EditText editText = (EditText) convertView.findViewById(R.id.editText);
//為了避免輸入框監聽的沖突,解綁監聽
if(editText.getTag() instanceof TextWatcher){
editText.removeTextChangedListener((TextWatcher) editText.getTag());
}
//給輸入框控件指派,添加監聽
editText.setText(hashMap.get(position));
editText.setTextColor(Color.BLACK);
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if(TextUtils.isEmpty(s)){
hashMap.put(position,"");
}else {
hashMap.put(position,s.toString());
}
}
};
editText.addTextChangedListener(textWatcher);
//editText和監聽綁定
editText.setTag(textWatcher);
//解決焦點複用bug
editText.clearFocus();
return convertView;
}
}
}