zoukankan      html  css  js  c++  java
  • Android控件ListView获取item中EditText值

    能够明白,如今没有直接方法能够获得ListView中每一行EditText的值.

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

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

        代码:

    package com.exmyth.android;
    
    public class ListEditorAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private List<Map<String, Object>> mData;// 存储的EditText值
        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;
            // convertView为null的时候初始化convertView。

    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());// 当EditText数据发生改变的时候存到data变量中 } } } 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;// ListView中的输入 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());
    }


  • 相关阅读:
    Linux编程 22 shell编程(输出和输入重定向,管道,数学运算命令,退出脚本状态码)
    mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
    mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)
    mysql 开发进阶篇系列 44 物理备份与恢复( 热备份xtrabackup 工具介绍)
    Linux编程 21 shell编程(环境变量,用户变量,命令替换)
    Linux编程 20 shell编程(shell脚本创建,echo显示信息)
    mysql 开发进阶篇系列 43 逻辑备份与恢复(mysqldump 的基于时间和位置的不完全恢复)
    Linux编程 19 编辑器(vim 用法)
    (网页)angularjs中的interval定时执行功能(转)
    (网页)在SQL Server中为什么不建议使用Not In子查询(转)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6773823.html
Copyright © 2011-2022 走看看