安卓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());
}
安卓Android控件ListView获取item中EditText值的更多相关文章
- Android控件ListView获取item中EditText值
能够明白,如今没有直接方法能够获得ListView中每一行EditText的值. 解决方式:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值. 大概算法:重写Ba ...
- [Android Pro] android控件ListView顶部或者底部也显示分割线
reference to : http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在 ...
- 从外部访问 Template (模板)的控件、获取它的属性值
DataTemplate 和 ControlTemplate 两个类均派生自 FrameWorkTemplate类.这个类有个 FindName方法 供我们查询内部控件. ControlTempla ...
- mvc 用户控件 ascx 获取 View 页面的值
<%Html.RenderAction("AscxSideNav", "UI", new {itemName=ViewData["ItemNam ...
- android中与Adapter相关的控件----ListView
ListView讲解: 一.ListView这个控件是一个使用非常广泛的控件,值得深入的学习和研究.基本使用已经在Adapter中使用过了 二.常用的属性和方法 footerDividersEnabl ...
- Android控件RecyclerView与ListView的异同
在我的一篇介绍Android新控件RecyclerView的博客(Android L新控件RecyclerView简介)中,一个读者留言说RecyclerView跟ListView之间好像没有什么不同 ...
- 【Android】12.0 UI开发(三)——列表控件ListView的简单实现2
1.0 由于书上内容,已经和实际编程的兼容性已经不太友好,重写了项目,用于进一步学习列表控件ListView. 2.0 新建项目ListViewTest,其中文件目录如下: 3.0 ActivityC ...
- Android基础控件ListView基础操作
1.简介 基于Android基础控件ListView和自定义BaseAdapter适配器情况下,对ListView的数据删除和添加操作: public boolean add(E e) {//添加数据 ...
- Robotium之Android控件定位实践和建议(Appium/UIAutomator姊妹篇)
本人之前以前撰文描写叙述Appium和UIAutomator框架是怎样定位Android界面上的控件的. UIAutomator定位Android控件的方法实践和建议 Appium基于安卓的各种Fin ...
随机推荐
- unite
列出某个集合里的项目,比如file,buffer等 :United file——列出文件 :United buffer——列出buffer :United file_rec——递归列出文件 进入Uni ...
- 【POJ】3415 Common Substrings
后缀数组可解.使用单调栈优化. /* 3415 */ #include <iostream> #include <sstream> #include <string> ...
- poj1195Mobile phones(二维树状数组)
http://poj.org/problem?id=1195 模版题 i写成k了 找了一个多小时没找出来.. #include <iostream> #include<cstring ...
- poj3265
考状态的dp 我的方法可能比较奇怪 设f[i,j]表示第i个月解决j个问题可以最多解决到第几个问题 容易知道,答案(月份)不会超过2n+1: f[i,j]=max(f[i-1,k]+j) 复杂度为O( ...
- 【 D3.js 高级系列 — 5.1 】 颜色插值和线性渐变
颜色插值指的是给出两个 RGB 颜色值,两个颜色之间的值通过插值函数计算得到.线性渐变是添加到 SVG 图形上的过滤器,只需给出两端的颜色值即可. 1. 颜色插值 在[高级 - 第 5.0 章]里已经 ...
- 自杀程序&递归删除目录
自杀程序,删掉自身,包括执行程序所在的文件夹. 仅在windows下进行了测试,使用语言C# string fileName = Path.GetTempPath() + "killmyse ...
- SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
- HDU 1024 Max Sum Plus Plus 简单DP
这题的意思就是取m个连续的区间,使它们的和最大,下面就是建立状态转移方程 dp[i][j]表示已经有 i 个区间,最后一个区间的末尾是a[j] 那么dp[i][j]=max(dp[i][j-1]+a[ ...
- codeforces 629D 树状数组+LIS
题意:n个圆柱形蛋糕,给你半径 r 和高度 h,一个蛋糕只能放在一个体积比它小而且序号小于它的蛋糕上面,问你这样形成的上升序列中,体积和最大是多少 分析:根据他们的体积进行离散化,然后建树状数组,按照 ...
- ZOJ 3469 Food Delivery 区间DP
这道题我不会,看了网上的题解才会的,涨了姿势,现阶段还是感觉区间DP比较难,主要是太弱...QAQ 思路中其实有贪心的意思,n个住户加一个商店,分布在一维直线上,应该是从商店开始,先向两边距离近的送, ...