安卓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 ...
随机推荐
- Android中Input型输入设备驱动原理分析<一>
话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反正这个是没变的,在android的底层开发中对于Linux的基本驱动程序设计还是没变的,当然Android底层机制也 ...
- C语言字符串函数
strtok() 字符串分割函数strstr() 字符串查找函数 范例 #include <string.h> main() { char * s = " ...
- Java之跳出多重循环
在java里,想要跳出多重循环,有两种方法 1.在循环语句前设置一个标记,然后使用带有该标记的break语句跳出该循环 public static void main(String args[]) { ...
- Hadoop单机模式安装
一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: ...
- Linux命令行批量替换多文件中的字符串【转】
Linux命令行批量替换多文件中的字符串[转自百度文库] 一种是Mahuinan法,一种是Sumly法,一种是30T法分别如下: 一.Mahuinan法: 用sed命令可以批量替换多个文件中的字符串. ...
- 结构体buf_chunk_t
/** Buffer pool chunk comprising buf_block_t */ typedef struct buf_chunk_struct buf_chunk_t; /** A c ...
- POJ 1269 (直线相交) Intersecting Lines
水题,以前总结的模板还是很好用的. #include <cstdio> #include <cmath> using namespace std; ; int dcmp(dou ...
- varchar与nvarchar的区别
nvarchar可变长度的Unicode字符数据 varchar可变长度且非 Unicode 的字符数据 举例: varchar(1) --可以插进入一个数字或者一个字母,如果要插入一个汉字改为v ...
- 《深入Java虚拟机学习笔记》- 第17章 异常
<深入Java虚拟机学习笔记>- 第17章 异常
- 2、Android应用程序基本特性
1. apk是android应用程序安装格式,.dex是Android二进制执行文件格式. 2.Android操作系统是基于Linux的多用户操作系统,每一个应用程序都是使用的不同的用户. 3. 默认 ...