您的位置:首页 > 移动开发 > Android开发

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview