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());
    }


  • 相关阅读:
    机器学习(十七)— SVD奇异值分解
    机器学习(十五)— Apriori算法、FP Growth算法
    机器学习(十四)— kMeans算法
    深度学习—反卷积的理解
    【ECMAScript5】ECMAScript5中有关数组的常用方法
    【window】window10永久关闭更新
    【js】使用javascript 实现静态网页分页效果
    【vue】钩子函数生命周期
    【vue】vue中ref用法
    【vue-waring】element UI 由版本1.4.12 升级到element-ui@2.0.10
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6773823.html
Copyright © 2011-2022 走看看