ListView中EditText焦点获取
2016-08-23 20:17
381 查看
本文解决的问题:
ListView中EditText的焦点如何获取?如何存储每个EditText中的数据?
动态添加(删除)Item的个数?
如果限定了EditText的行数,解决输入内容超过额定行数时,EditText不可滑动的问题。
运行后的效果图
Activity的基本操作
public class EditTextActivity extends AppCompatActivity { private static final String TAG = "EditTextActivity"; private ListView edittextLv; private Button addBtn; private List<ItemBean> list = new ArrayList<ItemBean>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit_text); this.addBtn = (Button) findViewById(R.id.add_btn); this.edittextLv = (ListView) findViewById(R.id.edittext_lv); //默认显示3条Item数据 for (int i=0; i<3; i++) { list.add(new ItemBean("name" + i, "address" + i)); } final EditTextAdapter adapter = new EditTextAdapter(this, list); edittextLv.setAdapter(adapter); //动态添加Item addBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { list.add(new ItemBean("null", "null")); adapter.notifyDataSetChanged(); } }); } }
JavaBean的实现
public class ItemBean { public String name; public String address; public ItemBean(String name, String address) { this.name = name; this.address = address; } }
Adapter代码的实现
public class EditTextAdapter extends BaseAdapter { private static final String TAG = EditTextAdapter.class.getSimpleName(); private Context mContext; private List<ItemBean> mData; int index = -1; public EditTextAdapter(Context context, List<ItemBean> data) { mContext = context; mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_edit_text, null); holder = new ViewHolder(); holder.name = (TextView) convertView.findViewById(R.id.name_tv); holder.address = (EditText) convertView.findViewById(R.id.address_edt); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.name.setText(mData.get(position).name); ItemBean bean = mData.get(position); final EditText editText = holder.address; // 此处必须根据Tag移除之前的监听事件,否则会造成数据丢失,错乱的问题; if (editText.getTag() instanceof TextWatcher) { editText.removeTextChangedListener((TextWatcher) (editText.getTag())); } editText.setText(bean.address); // 根据手指触碰的位置,获取当前EditText的位置; editText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // 1.解决第4个问题(不可滑动的问题) v.getParent().requestDisallowInterceptTouchEvent(true); if (event.getAction() == MotionEvent.ACTION_UP) { index = position; // 2.解决第4个问题(不可滑动的问题) v.getParent().requestDisallowInterceptTouchEvent(false); } return false; } }); TextWatcher watcher = 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) { // 动态存储数据 mData.get(position).address = s.toString(); Log.d(TAG, "输入的文本" + position + "" + s.toString()); } }; editText.addTextChangedListener(watcher); editText.setTag(watcher); // 这部分代码必须放在getView()的最后,return convertView之前执行; editText.clearFocus(); if (index != -1 && index == position) { Log.d(TAG, "index:" + position + " position" + position); // 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。 editText.requestFocus(); } // 解决光标始终处在最开始位置的问题; editText.setSelection(editText .getText().length()); return convertView; } class ViewHolder { TextView name; EditText address; } }
Adapter的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:textSize="20sp" android:text="name" android:padding="15dp" android:id="@+id/name_tv" android:layout_width="match_parent" android:layout_height="wrap_content"/> <EditText android:textSize="20sp" android:id="@+id/address_edt" android:text="address" android:padding="15dp" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
相关文章推荐
- 去掉谷歌浏览器获取焦点时默认的input、textarea的边框和背景
- bootstrap模态框和select2合用时input无法获取焦点
- android登录框获取焦点时背景切换效果
- 判断文本框是否已经获取焦点 和 判断复选框是否选定
- win32 获取当前焦点的几个函数
- Android取消EditText自动获取焦点默认行为
- input输入框在ios手机上获取焦点后有一个灰色阴影
- html中去掉input获取焦点时候的边框
- JS小插件-对输入框获取与失去焦点时的操作
- 禁止EditText 自动获取焦点
- android 布局文件中 view 焦点获取浅析
- 如何让TEdit在获取输入焦点后selectAll?
- 获取焦点的意思
- Edittext 默认不自动获取焦点
- android: 取消EditText控件自动获取焦点特性
- Android ListView 中子控件无法获取焦点的解决方法(主要针对键盘操作)
- WPF Focus 无法获取焦点问题
- EditText无法获取焦点 获取焦点无法编辑(android:descendantFocusability用法简析 )
- Android View如何获取焦点
- Android View如何获取焦点