Android控件ListView获取item中EditText值

时间:2023-01-22 22:40:24

可以明确,现在没有直接方法可以获得ListView中每一行EditText的值.

    解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值.

    大概算法:重写BaseAdapter.getView函数,用一个数组存储EditText中的值,根据position即数组下标,在getView中动态更新EditText和动态获取EditText中的值.因为ListView中的item是复用的,如果不动态清空或动态获取EditText中值,就会出现数据紊乱,或者没数据.那么在生成EditText的时候要监控其值的变化.存储下来.

    代码:

[java] view plain copy
  1. package com.exmyth.android;  
  2.   
  3. public class ListEditorAdapter extends BaseAdapter {  
  4.     private LayoutInflater mInflater;  
  5.     private List<Map<String, Object>> mData;// 存储的EditText值  
  6.     public Map<String, String> editorValue = new HashMap<String, String>();//  
  7.   
  8.     public ListEditorAdapter(Context context, List<Map<String, Object>> data) {  
  9.         mData = data;  
  10.         mInflater = LayoutInflater.from(context);  
  11.         init();  
  12.     }  
  13.   
  14.     // 初始化  
  15.     private void init() {  
  16.         editorValue.clear();  
  17.     }  
  18.   
  19.     @Override  
  20.     public int getCount() {  
  21.         return mData.size();  
  22.     }  
  23.   
  24.     @Override  
  25.     public Object getItem(int position) {  
  26.         return null;  
  27.     }  
  28.   
  29.     @Override  
  30.     public long getItemId(int position) {  
  31.         return 0;  
  32.     }  
  33.   
  34.     private Integer index = -1;  
  35.   
  36.     @Override  
  37.     public View getView(int position, View convertView, ViewGroup parent) {  
  38.         ViewHolder holder = null;  
  39.         // convertView为null的时候初始化convertView。  
  40.         if (convertView == null) {  
  41.             holder = new ViewHolder();  
  42.             convertView = mInflater.inflate(R.layout.listview_item, null);  
  43.             holder.name = (TextView) convertView  
  44.                     .findViewById(R.id.list_item_name);  
  45.             holder.title = (TextView) convertView  
  46.                     .findViewById(R.id.list_item_title);  
  47.             holder.value = (EditText) convertView  
  48.                     .findViewById(R.id.list_item_inputvalue);  
  49.             holder.value.setTag(position);  
  50.             holder.userkey = (TextView) convertView.findViewById(R.id.user_key);  
  51.             holder.value.setOnTouchListener(new OnTouchListener() {  
  52.                 @Override  
  53.                 public boolean onTouch(View v, MotionEvent event) {  
  54.                     if (event.getAction() == MotionEvent.ACTION_UP) {  
  55.                         index = (Integer) v.getTag();  
  56.                     }  
  57.                     return false;  
  58.                 }  
  59.             });  
  60.             class MyTextWatcher implements TextWatcher {  
  61.                 public MyTextWatcher(ViewHolder holder) {  
  62.                     mHolder = holder;  
  63.                 }  
  64.   
  65.                 private ViewHolder mHolder;  
  66.   
  67.                 @Override  
  68.                 public void onTextChanged(CharSequence s, int start,  
  69.                         int before, int count) {  
  70.                 }  
  71.   
  72.                 @Override  
  73.                 public void beforeTextChanged(CharSequence s, int start,  
  74.                         int count, int after) {  
  75.                 }  
  76.   
  77.                 @Override  
  78.                 public void afterTextChanged(Editable s) {  
  79.                     if (s != null && !"".equals(s.toString())) {  
  80.                         int position = (Integer) mHolder.value.getTag();  
  81.                         mData.get(position).put("list_item_inputvalue",  
  82.                                 s.toString());// 当EditText数据发生改变的时候存到data变量中  
  83.                     }  
  84.                 }  
  85.             }  
  86.             holder.value.addTextChangedListener(new MyTextWatcher(holder));  
  87.             convertView.setTag(holder);  
  88.         } else {  
  89.             holder = (ViewHolder) convertView.getTag();  
  90.             holder.value.setTag(position);  
  91.         }  
  92.         Object value = mData.get(position).get("list_item_name");  
  93.         if (value != null) {  
  94.             holder.name.setText((String) value);  
  95.         }  
  96.         value = mData.get(position).get("list_item_title");  
  97.         if (value != null) {  
  98.             holder.title.setText(value.toString());  
  99.         }  
  100.         value = mData.get(position).get("user_key");  
  101.         if (value != null) {  
  102.             holder.userkey.setText(value.toString());  
  103.         } else {  
  104.             holder.userkey.setText("-1");  
  105.         }  
  106.         value = mData.get(position).get("list_item_inputvalue");  
  107.         if (value != null && !"".equals(value)) {  
  108.             holder.value.setText(value.toString());  
  109.         } else {  
  110.             String key = mData.get(position).get("user_key").toString();  
  111.             String inputValue = editorValue.get(key);  
  112.             holder.value.setText(inputValue);  
  113.         }  
  114.         holder.value.clearFocus();  
  115.         if (index != -1 && index == position) {  
  116.             holder.value.requestFocus();  
  117.         }  
  118.         return convertView;  
  119.     }  
  120.   
  121.     public final class ViewHolder {  
  122.         public TextView name;  
  123.         public TextView title;  
  124.         public EditText value;// ListView中的输入  
  125.         public TextView userkey;// 用来定义的标志性主键,可不用关心  
  126.     }  
  127. }  

使用方法:

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