可以明确,现在没有直接方法可以获得ListView中每一行EditText的值.
解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值.
大概算法:重写BaseAdapter.getView函数,用一个数组存储EditText中的值,根据position即数组下标,在getView中动态更新EditText和动态获取EditText中的值.因为ListView中的item是复用的,如果不动态清空或动态获取EditText中值,就会出现数据紊乱,或者没数据.那么在生成EditText的时候要监控其值的变化.存储下来.
代码:
[java] view plain copy
- package com.exmyth.android;
-
- public class ListEditorAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
- private List<Map<String, Object>> mData;
- public Map<String, String> editorValue = new HashMap<String, String>();
-
- public ListEditorAdapter(Context context, List<Map<String, Object>> data) {
- mData = data;
- mInflater = LayoutInflater.from(context);
- init();
- }
-
-
- private void init() {
- editorValue.clear();
- }
-
- @Override
- public int getCount() {
- return mData.size();
- }
-
- @Override
- public Object getItem(int position) {
- return null;
- }
-
- @Override
- public long getItemId(int position) {
- return 0;
- }
-
- private Integer index = -1;
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
-
- if (convertView == null) {
- holder = new ViewHolder();
- convertView = mInflater.inflate(R.layout.listview_item, null);
- holder.name = (TextView) convertView
- .findViewById(R.id.list_item_name);
- holder.title = (TextView) convertView
- .findViewById(R.id.list_item_title);
- holder.value = (EditText) convertView
- .findViewById(R.id.list_item_inputvalue);
- holder.value.setTag(position);
- holder.userkey = (TextView) convertView.findViewById(R.id.user_key);
- holder.value.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (event.getAction() == MotionEvent.ACTION_UP) {
- index = (Integer) v.getTag();
- }
- return false;
- }
- });
- class MyTextWatcher implements TextWatcher {
- public MyTextWatcher(ViewHolder holder) {
- mHolder = holder;
- }
-
- private ViewHolder mHolder;
-
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- if (s != null && !"".equals(s.toString())) {
- int position = (Integer) mHolder.value.getTag();
- mData.get(position).put("list_item_inputvalue",
- s.toString());
- }
- }
- }
- holder.value.addTextChangedListener(new MyTextWatcher(holder));
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- holder.value.setTag(position);
- }
- Object value = mData.get(position).get("list_item_name");
- if (value != null) {
- holder.name.setText((String) value);
- }
- value = mData.get(position).get("list_item_title");
- if (value != null) {
- holder.title.setText(value.toString());
- }
- value = mData.get(position).get("user_key");
- if (value != null) {
- holder.userkey.setText(value.toString());
- } else {
- holder.userkey.setText("-1");
- }
- value = mData.get(position).get("list_item_inputvalue");
- if (value != null && !"".equals(value)) {
- holder.value.setText(value.toString());
- } else {
- String key = mData.get(position).get("user_key").toString();
- String inputValue = editorValue.get(key);
- holder.value.setText(inputValue);
- }
- holder.value.clearFocus();
- if (index != -1 && index == position) {
- holder.value.requestFocus();
- }
- return convertView;
- }
-
- public final class ViewHolder {
- public TextView name;
- public TextView title;
- public EditText value;
- public TextView userkey;
- }
- }
使用方法:
private List<Map<String, Object>> mCheckItemList = new ArrayList<Map<String, Object>>();
mAdapter = new ListEditorAdapter(this, mCheckItemList);
m_lvListView.setAdapter(mAdapter);
直接改变mCheckItemList中的数据,然后调用mAdapter.notifyDataSetChanged();就可以更新ListView的数据
当然,直接从mCheckItemList也可以获得用户在EditText中输入的数据.比较方便
其他:
ListView list= (ListView)findViewById(R.id.list);//获得listview
for (int i = 0; i < list.getChildCount(); i++) {
LinearLayout layout = (LinearLayout)list.getChildAt(i);// 获得子item的layout
EditText et = (EditText) layout.findViewById(R.id.et);// 从layout中获得控件,根据其id
// EditText et = (EditText) layout.getChildAt(1)//或者根据位置,在这我假设TextView在前,EditText在后
System.out.println("the text of "+i+"'s EditText:----------->"+et.getText());
}
转载博客原文:http://blog.csdn.net/zz_mm/article/details/38235501