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

两个xml布局文件

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. main.xml  
  2.   
  3. <?xml version="1.0" encoding="utf-8"?>  
  4. <AbsoluteLayout  
  5. android:id="@+id/widget0"  
  6. android:layout_width="fill_parent"  
  7. android:layout_height="fill_parent"  
  8. xmlns:android="http://schemas.android.com/apk/res/android"  
  9. >  
  10. <ListView  
  11. android:id="@+id/LV"  
  12. android:layout_width="252px"  
  13. android:layout_height="278px"  
  14. android:layout_x="10px"  
  15. android:layout_y="118px"  
  16. >  
  17. </ListView>  
  18. </AbsoluteLayout>  
  19.   
  20.   
  21.    
  22.   
  23. 2.list_view.xml  
  24.   
  25. <?xml version="1.0" encoding="utf-8"?>  
  26. <RelativeLayout  
  27. android:id="@+id/RelativeLayout01"  
  28. android:layout_width="fill_parent"  
  29. android:layout_height="wrap_content"  
  30. xmlns:android="http://schemas.android.com/apk/res/android"  
  31. >  
  32. <EditText  
  33. android:id="@+id/Erm_qty"  
  34. android:layout_width="60px"  
  35. android:layout_height="38px"  
  36. android:textSize="12sp"  
  37. android:layout_alignParentTop="true"  
  38. android:layout_alignParentRight="true"  
  39. android:numeric="integer"  
  40. android:singleLine="true"  
  41. >  
  42. </EditText>  
  43. <TextView  
  44. android:id="@+id/Trm_type"  
  45. android:layout_width="273px"  
  46. android:layout_height="34px"  
  47. android:layout_alignParentTop="true"  
  48. android:layout_alignParentLeft="true"  
  49. android:textSize="15sp"  
  50. >  
  51. </TextView>  
  52. </RelativeLayout>  

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


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

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


我自己通过ViewHolder始终没能解决这个文字信息乱跳问题,所幸直接不用Viewholder,用最简单的convetView来处理,首先
  1.  //定义一个HashMap,用来存放EditText的值,Key是position  
  2.     HashMap<Integer, String> hashMap = new HashMap<Integer, String>();  


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaanming;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.text.Editable;  
  10. import android.text.TextWatcher;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.EditText;  
  16. import android.widget.ListView;  
  17.   
  18. public class ListViewActivity extends Activity {  
  19.     private ListView listView;  
  20.     private Adapter adapter;  
  21.     List<String> dataList = new ArrayList<String>();  
  22.   
  23.     //定义一个HashMap,用来存放EditText的值,Key是position  
  24.     HashMap<Integer, String> hashMap = new HashMap<Integer, String>();  
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main);  
  30.           
  31.         //加入数据  
  32.         dataList = addData();  
  33.           
  34.         //实例化ListView 并设置Adapter  
  35.         listView = (ListView)findViewById(R.id.listView);  
  36.         adapter = new Adapter();  
  37.         listView.setAdapter(adapter);  
  38.     }  
  39.       
  40.     //往ListView 里面添加数据的方法  
  41.     private List<String> addData(){  
  42.         List<String> list = new ArrayList<String>();  
  43.         list.add("为你写诗");  
  44.         list.add("我爱你");  
  45.         list.add("傻瓜");  
  46.         list.add("这就是爱");  
  47.         list.add("我们在一起");  
  48.         list.add("永远不分离");  
  49.         list.add("想你的夜");  
  50.         list.add("十年");  
  51.         list.add("飞机场");  
  52.         list.add("爱很简单");  
  53.         list.add("普通朋友");  
  54.         list.add("我们两");  
  55.         list.add("富士三下");  
  56.         list.add("离别");  
  57.         list.add("们两");  
  58.           
  59.         return list;  
  60.     }  
  61.       
  62.       
  63.       
  64.       
  65.     //自定义Adapter  
  66.     class Adapter extends BaseAdapter{  
  67.   
  68.         @Override  
  69.         public int getCount() {  
  70.             return dataList.size();  
  71.         }  
  72.   
  73.         @Override  
  74.         public Object getItem(int position) {  
  75.             return dataList.get(position);  
  76.         }  
  77.   
  78.         @Override  
  79.         public long getItemId(int position) {  
  80.             return position;  
  81.         }  
  82.   
  83.         @Override  
  84.         public View getView(final int position, View convertView, ViewGroup parent) {  
  85.             String str = dataList.get(position);  
  86.             convertView = LayoutInflater.from(getApplication()).inflate(R.layout.listview_item, null);  
  87.               
  88.             final EditText editText = (EditText)convertView.findViewById(R.id.editText1);  
  89.             editText.setText(str);  
  90.               
  91.             //为editText设置TextChangedListener,每次改变的值设置到hashMap  
  92.             //我们要拿到里面的值根据position拿值  
  93.             editText.addTextChangedListener(new TextWatcher() {  
  94.                 @Override  
  95.                 public void onTextChanged(CharSequence s, int start, int before, int count) {  
  96.                       
  97.                 }  
  98.                   
  99.                 @Override  
  100.                 public void beforeTextChanged(CharSequence s, int start,   
  101.                         int count,int after) {  
  102.                       
  103.                 }  
  104.                   
  105.                 @Override  
  106.                 public void afterTextChanged(Editable s) {  
  107.                     //将editText中改变的值设置的HashMap中  
  108.                     hashMap.put(position, s.toString());  
  109.                 }  
  110.             });  
  111.               
  112.             //如果hashMap不为空,就设置的editText  
  113.             if(hashMap.get(position) != null){  
  114.                 editText.setText(hashMap.get(position));  
  115.             }  
  116.               
  117.               
  118.             return convertView;  
  119.         }  
  120.           
  121.     }  
  122.       
  123. }  

也算是解决了文字乱跳的问题。。各位大牛要是知道用ViewHolder怎么来搞定这个问题麻烦给小弟留言哈
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用、[2]和,Android实现ListViewEditText搜索框动态显示数据的方法如下: 1. 首先,在布局文件创建一个包含EditTextListView的布局。 2. 创建一个适配器(如SimpleAdapter)来绑定ListView和数据源。 3. 在EditText的文本改变监听器获取用户输入的关键字并进行筛选。 4. 根据关键字筛选数据,并更新适配器的数据集。 5. 调用适配器的notifyDataSetChanged()方法来通知ListView更新显示的数据。 具体实现步骤如下: 1. 在布局文件添加一个EditText和一个ListView组件。 2. 创建一个适配器,如SimpleAdapter,用来绑定ListView和数据源。 3. 在Activity或Fragment找到EditTextListView组件,并设置适配器。 4. 在EditText的文本改变监听器获取用户输入的关键字。 5. 根据关键字筛选数据,并更新适配器的数据集。 6. 调用适配器的notifyDataSetChanged()方法来更新ListView显示的数据。 以下是一个示例代码: ```java // 布局文件的代码 <LinearLayout> <EditText android:id="@+id/editText" /> <ListView android:id="@+id/listView" /> </LinearLayout> // 在Activity或Fragment的代码 EditText editText = findViewById(R.id.editText); ListView listView = findViewById(R.id.listView); List<Map<String, String>> dataList = new ArrayList<>(); // 数据源 SimpleAdapter adapter = new SimpleAdapter(this, dataList, R.layout.list_item, new String[]{"name"}, new int[]{R.id.textView}); listView.setAdapter(adapter); editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { String keyword = s.toString(); // 根据关键字筛选数据 List<Map<String, String>> filteredDataList = filterData(dataList, keyword); // 更新适配器的数据集 adapter.clear(); adapter.addAll(filteredDataList); adapter.notifyDataSetChanged(); } }); // 根据关键字筛选数据的方法 private List<Map<String, String>> filterData(List<Map<String, String>> dataList, String keyword) { List<Map<String, String>> filteredList = new ArrayList<>(); for (Map<String, String> data : dataList) { String name = data.get("name"); if (name.toLowerCase().contains(keyword.toLowerCase())) { filteredList.add(data); } } return filteredList; } ``` 通过以上步骤,你可以在Android实现一个带有EditText搜索框的ListView,根据用户输入的关键字动态显示过滤后的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值