虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Android编程 > Android控件ListView获取item中EditText值

Android控件ListView获取item中EditText值
类别:Android编程   作者:码皇   来源:互联网   点击:

可以明确,现在没有直接方法可以获得ListView中每一行EditText的& 20540; 解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText& 20540; 大概算法:重写BaseAdapter getView函

可以明确,现在没有直接方法可以获得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 < 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());
}


相关热词搜索: 控件