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

  • 相关阅读:
    Vue 踩坑-2 vue文件中style的scoped属性
    IIS发布Vue项目F5刷新404问题
    .NET Core 3.1 + Hangfire 配置以及踩坑
    Vue 踩坑-1-跨域问题
    Docker 部署VUE项目
    (转)如何利用EnteLib Unity Interception Extension 和PIAB实现Transaction的Call Handler
    Unity 中的策略注入(转)
    面向方面的编程、侦听和 Unity 2.0(转)
    Unity 中的拦截功能(转)
    [转]推荐分享22个优秀的项目管理与协作工具
  • 原文地址:https://www.cnblogs.com/exmyth/p/3799260.html
Copyright © 2020-2023  润新知