您的位置:首页 > 移动开发 > Android开发

Android - ListView自定义Adapter中获得EditText的值

2014-01-01 16:52 609 查看
转自:http://pt990.blog.163.com/blog/static/185726158201142410448867/
两个xml布局文件

main.xml

<?xml version="1.0" encoding="utf-8"?>

<AbsoluteLayout

android:id="@+id/widget0"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android"

>

<ListView

android:id="@+id/LV"

android:layout_width="252px"

android:layout_height="278px"

android:layout_x="10px"

android:layout_y="118px"

>

</ListView>

</AbsoluteLayout>

 

2.list_view.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout

android:id="@+id/RelativeLayout01"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

xmlns:android="http://schemas.android.com/apk/res/android"

>

<EditText

android:id="@+id/Erm_qty"

android:layout_width="60px"

android:layout_height="38px"

android:textSize="12sp"

android:layout_alignParentTop="true"

android:layout_alignParentRight="true"

android:numeric="integer"

android:singleLine="true"

>

</EditText>

<TextView

android:id="@+id/Trm_type"

android:layout_width="273px"

android:layout_height="34px"

android:layout_alignParentTop="true"

android:layout_alignParentLeft="true"

android:textSize="15sp"

>

</TextView>

</RelativeLayout>

建立一个ListView,其中每一个item上都有一个TextView, 一个EditView

如图:



 

 当ListView出现滚动条的时候,有个问题就出现了,在滑动listview的时候会发现后面的EditView会填上前面的EditView中的值.

首先看一下listview的运行原理,如下图



当listview出现滚动条,按照如上图所示的方式滑动,item1滑出listview,item8进入listview的时候, listview并没有重新去new一个item,在UI上listview始终只是显示1~7个Item,当滑动成如上图的结果后.listview只是把item1变成item8,而不是去new item8,因此产生了上述问题.item8里面的EditText中的值其实是缓存的Item1里的EditText的值.
因此要解决这个问题,要自己建立一个数据结构比如ArrayList来存EditText中的值,在滑动的时候根据position读入对应位置的值.
 
可是这样又会出现一个问题,修改了EditText后再滑动ListView,修改的值又还原成了原来的值.解决这个问题首先想到的是给EditText addTextChangedListener, 在EditText改变的时候去修改ArrayList的值,然后这个方法确行不通,原因如下:
比如说原来只显示3个item每个item上都是一个EditText

item1 中EditText的值是 "111"

item2 中EditText的值是 "222"

item3 中EditText的值是 "333"

根据listView的原理

在滑动listveiw让item1消失,item4出现的时候listview其实是不会去生成一个item4,而是变成

item2 -> "222"

item3 -> "333"

item1 -> "444"

那这个时候他就触发了EditText的ontextchanged,因为原来的item1中EditText的值是111而现在变成了444,在发生变化的时候position是1, 如果这个是后我去修改了, 那我的list里就把第一个值修改成了444,错误就产生了
为了避免这个问题,可以考虑将代码写在EditText的setOnFocusChangeListener中.
 
 
完整代码如下:
package test.demo;
import java.util.ArrayList;

import java.util.HashMap;
import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnFocusChangeListener;

import android.widget.BaseAdapter;

import android.widget.EditText;

import android.widget.ListView;

import android.widget.TextView;
public class demo extends Activity{

    /** Called when the activity is first created. */

 private ListView listview;

 private ArrayList<HashMap<String, Object>> item;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        listview = (ListView)findViewById(R.id.LV);

        item = new ArrayList<HashMap<String, Object>>();

        

        for(int i = 0; i < 15; i++)

        {

      HashMap<String, Object> map = new HashMap<String, Object>();  

         map.put("Trm_type", "Text" + i);           

         map.put("Erm_qty", "Edit" + i);   

         item.add(map);

        }
        MyAdapter myadapter = new MyAdapter(demo.this);

        listview.setAdapter(myadapter);

    }

 
    public final class ViewHolder

    {

        public TextView Trmtype;

        public EditText Ermqty;

    }

    

    public class MyAdapter extends BaseAdapter

    {

     private LayoutInflater mInflater;

     boolean flag;

     public MyAdapter(Context context)

     {

         this.mInflater = LayoutInflater.from(context);

     }

     

  @Override

  public int getCount() {

   // TODO Auto-generated method stub

   return item.size();

  }
  @Override

  public Object getItem(int arg0) {

   // TODO Auto-generated method stub

   return null;

  }
  @Override

  public long getItemId(int arg0) {

   // TODO Auto-generated method stub

   return 0;

  }
  @Override

  public View getView(final int position, View convertView, ViewGroup parent) {

   // TODO Auto-generated method stub

   ViewHolder holder = null;

   if (convertView == null)  

   {

       holder = new ViewHolder();  

       convertView = mInflater.inflate(R.layout.list_view, null);

       holder.Trmtype = (TextView)convertView.findViewById(R.id.Trm_type);

       holder.Ermqty = (EditText)convertView.findViewById(R.id.Erm_qty);

       convertView.setTag(holder);

   }

   else  

   {

       holder = (ViewHolder)convertView.getTag();

   }

   holder.Trmtype.setText((String)item.get(position).get("Trm_type"));

   holder.Ermqty.setText((String)item.get(position).get("Erm_qty"));

   holder.Ermqty.setOnFocusChangeListener(new OnFocusChangeListener()

   {
    @Override

    public void onFocusChange(View arg0, boolean arg1) {

     // TODO Auto-generated method stub

     if(arg1 == false)

     {

      EditText edt = (EditText)arg0.findViewById(R.id.Erm_qty);

      String strEdit = edt.getText().toString();

      String strText = item.get(position).get("Trm_type").toString();

         HashMap<String, Object> tmp = new HashMap<String, Object>();  

            tmp.put("Trm_type", strText);           

            tmp.put("Erm_qty", strEdit);

            item.set(position, tmp);

     }

   }});

   return convertView;

  }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐