项目中需要在ListView中为每个Item添加edittext,编辑实体数据的值,此文章解决滚动冲突,键盘弹出、及数据保存。
为当前Activity添加windowSoftInputMode=adjustPan
…
public class ListViewEditTextActivity extends AppCompatActivity {
private List<Bean> list = new ArrayList<>();
private ListView mListView;
public static final String TAG = ListViewEditTextActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main11);
init();
mListView = (ListView) findViewById(R.id.lv);
mListView.setAdapter(new MyAdapter());
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
if (mark != null) {
mark.removeTextChangedListener(mWatcher);
Log.d(TAG, "onScrollStateChanged: mark.getTag() = " + mark.getTag());
}
}
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
}
});
}
private void init() {
for (int i = 0; i < 30; i++) {
list.add(new Bean(String.valueOf(i)));
}
}
//使用Field变量
private MyWatcher mWatcher = new MyWatcher();
private EditText mark;
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
if (view == null) {
view = LayoutInflater.from(ListViewEditTextActivity.this).inflate(R.layout.item, null);
}
final EditText et = (EditText) view.findViewById(R.id.et);
et.clearFocus();//清除所有edittext的焦点
final Bean bean = list.get(i);
et.setText(bean.getMsg());//通过Bean实体类设置数据
et.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int action = motionEvent.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
et.addTextChangedListener(mWatcher);//触摸事件中,为该EditText 添加监听器
mWatcher.setPosition(i);//把当前Bean的位置传递到TextWatcher中
mark = et;//通过field变量指向当前EditText,并在ListView滚动时清除监听器
mark.setTag(i);//调试使用,判断是否为正确的位置
break;
}
return false;
}
});
return view;
}
}
public class MyWatcher implements TextWatcher {
private int position = -1;//通过该位置指向数据集合中的位置,并用来修改Bean的数据
@Override
public void afterTextChanged(Editable editable) {
Bean bean = list.get(position);
bean.setMsg(editable.toString());
Log.d(TAG, "afterTextChanged: position = " + position);
Log.d(TAG, "afterTextChanged: bean = " + bean);
}
public void setPosition(int position) {
this.position = position;
}
@Override
public String toString() {
return "MyWatcher{" +
"position=" + position +
'}';
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
}
}