展会信息港展会大全

Android控件ListView获取item中EditText值
来源:互联网   发布日期:2015-12-04 16:23:59   浏览:6462次  

导读:可以明确,现在没有直接方法可以获得ListView中每一行EditText的值. 解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的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> mData;// 存储的EditText值

public Map editorValue = new HashMap();//

public ListEditorAdapter(Context context, List> 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> mCheckItemList = new ArrayList>();

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

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开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港