效果图:
界面: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;
}
}
}