安卓ListView的Item中含有EditText,EditText里面的值保存,并且滑动ListView时EditText值不改变

来源:互联网 发布:乐百视网络机顶盒 编辑:IT博客网 时间:2020/02/23 12:44

前一段时间项目中用ListView ,ListView的item是EditText,然后设置EditText的值,滑动ListVIew,EditText中的值就改变了,当时在网上查了查各种各样的说法,最后找方法先把问题给解决了,今天闲来没事就写篇博客,说说怎么做的:

首先,主布局文件就一个ListView

   <ListView        android:id="@+id/listView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:cacheColorHint="@android:color/transparent"        android:divider="@android:color/transparent"        android:listSelector="@android:color/transparent"         android:scrollbars="none">
接着,在MainActivity中设置adapter

     @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.listView);MyAdapter myAdapter = new MyAdapter(this);listView.setAdapter(myAdapter);}
最后看看adapter
view里边就一个TextView,EditText
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal"     android:padding="30dp">    <TextView        android:id="@+id/tv_position"        android:layout_width="wrap_content"        android:layout_height="60dp"        android:gravity="center_vertical"        android:text="第0个"         android:padding="6dp"/>    <EditText        android:id="@+id/et_number"        android:layout_width="match_parent"        android:layout_height="60dp"        android:gravity="center_vertical" /></LinearLayout>
最后看MyAdapter

public class MyAdapter extends BaseAdapter {    private Context context;    HashMap<Integer, String> saveMap;//这个集合用来存储对应位置上Editext中的文本内容    public MyAdapter(Context context) {        super();        this.context = context;        saveMap = new HashMap<Integer, String>();    }    @Override    public int getCount() {        return 30;    }    @Override    public Object getItem(int position) {        return null;    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        ViewHolder vh = null;        if (convertView == null) {            vh = new ViewHolder();            convertView = View.inflate(context, R.layout.item_editext, null);            vh.et_number = (EditText) convertView.findViewById(R.id.et_number);            vh.tv_position = (TextView) convertView                    .findViewById(R.id.tv_position);            convertView.setTag(vh);        } else {            vh = (ViewHolder) convertView.getTag();        }        vh.tv_position.setText("第" + position + "个:");                vh.et_number.setTag(position);//设置editext一个标记          vh.et_number.clearFocus();//清除焦点  不清除的话因为item复用的原因   多个Editext同时改变        vh.et_number.setText(saveMap.get(position));//将对应保存在集合中的文本内容取出来  并显示上去                final EditText tempEditText=vh.et_number;        vh.et_number.addTextChangedListener(new TextWatcher() {            @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) {                Integer tag= (Integer) tempEditText.getTag();                saveMap.put(tag, s.toString());//在这里根据position去保存文本内容            }        });        Log.e("TAG", saveMap.toString());        return convertView;    }    public class ViewHolder {        EditText et_number;        TextView tv_position;    }}
最后测试下:

分别在第一个,第三个,最后一个中分别写入01,03,029

来回滑动下发现屏幕上显示没问题,看Log


值也保存上了 ,

点击这里下载源码

0 0
原创粉丝点击