Android 解决ListView中有EditText时,数据丢失问题
2016-05-11 23:05
567 查看
Android开发中,有时可能会碰到ListView中含有EditText的需求,但是EditText这种控件在ListView进行滑动的时候,或者新数据被添加的时候,数据会丢失,解决方法就是,时刻保存数据。
先看看完成后的动态效果图:‘
怎么保存这些数据呢?
其实很简单,就是利用EditText的addTextChangedListener的方法,数据每被修改,就保存数据,主代码代码如下:
有朋友可能会说,怎么不用ViewHolder提升性能呢? 如果能用,我肯定会用,但是实验过后,发现还是会出现数据丢失的情况,所有这种情况下就没法使用封装好的通用Adapter了。
下面是MainActivity.java的代码:
这里使用 是用LinkedList作为数据源的类型,而不是用ArrayList,原因有二:
1、该类中有set方法,可以直接修改 某位置 的数据,方便操作
2、增删改的效率比ArrayList高
接下来看看布局文件, 首先是主布局文件 activity_main.xml
接下来就是 ListView的item布局 lv_item_demo.xml
最后,附上 demo 的下载链接 (免费):
http://download.csdn.net/detail/chang_1134/9517307
先看看完成后的动态效果图:‘
怎么保存这些数据呢?
其实很简单,就是利用EditText的addTextChangedListener的方法,数据每被修改,就保存数据,主代码代码如下:
package cn.demo.myapplication; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; import java.util.LinkedList; /** * Created by Administrator on 2016/5/11. * Author jxc */ class MyAdapter extends BaseAdapter { private Context mContext; //是用链表的List作为数据源的类型,主要是因为该类型有set方法, // 可以直接修改 某位置 的数据,而且增删改的效率也比ArrayList高 private LinkedList<String> mDatas; public MyAdapter(Context context, LinkedList<String> data) { this.mContext = context; if (data == null) { data = new LinkedList<>(); } this.mDatas = data; } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } //给数据源添加数据 public void addData(String item) { mDatas.add(item); this.notifyDataSetChanged(); } @Override public View getView(final int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(mContext).inflate(R.layout.lv_item_demo, null); TextView tvCount = (TextView) convertView.findViewById(R.id.tv_count); EditText etContent = (EditText) convertView.findViewById(R.id.et_content); ImageButton ibDel = (ImageButton) convertView.findViewById(R.id.ibt_delete); //将数据源中已保存的数据放置进去 etContent.setText((String) getItem(position)); //设置文本序号 tvCount.setText(String.valueOf(position)); //关键就是这里的保存数据 etContent.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) { //每当内容改变时,就更新mDatas中的数据 mDatas.set(position, s.toString()); } @Override public void afterTextChanged(Editable s) { } }); //监听删除按钮的点击事件 ibDel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDatas.remove(position); MyAdapter.this.notifyDataSetChanged(); } }); return convertView; } }
有朋友可能会说,怎么不用ViewHolder提升性能呢? 如果能用,我肯定会用,但是实验过后,发现还是会出现数据丢失的情况,所有这种情况下就没法使用封装好的通用Adapter了。
下面是MainActivity.java的代码:
public class MainActivity extends Activity { private LinkedList<String> mDatas; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); } //点击事件--添加 public void addClick(View view) { mAdapter.addData(""); } private void initData() { //设置数据源 mDatas = new LinkedList<>(); mDatas.add(""); mDatas.add(""); mDatas.add(""); } private void initView() { mAdapter = new MyAdapter(this, mDatas); ListView listView = (ListView) findViewById(R.id.listview); listView.setAdapter(mAdapter); } }
这里使用 是用LinkedList作为数据源的类型,而不是用ArrayList,原因有二:
1、该类中有set方法,可以直接修改 某位置 的数据,方便操作
2、增删改的效率比ArrayList高
接下来看看布局文件, 首先是主布局文件 activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <Button android:layout_width="match_parent" android:text="添加" android:onClick="addClick" android:layout_height="wrap_content" /> <ListView android:layout_width="match_parent" android:id="@+id/listview" android:scrollbars="none" android:layout_height="wrap_content" /> </LinearLayout>
接下来就是 ListView的item布局 lv_item_demo.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:text="1" android:id="@+id/tv_count" android:textSize="18sp" android:layout_marginLeft="10dp" android:layout_height="wrap_content" /> <EditText android:id="@+id/et_content" android:layout_width="0dp" android:layout_height="40dp" android:layout_marginRight="10dp" android:layout_weight="1" android:maxLength="12" android:singleLine="true" /> <ImageButton android:id="@+id/ibt_delete" android:layout_width="25dp" android:layout_height="25dp" android:layout_marginRight="10dp" android:background="@drawable/btn_delete_red_circle" /> </LinearLayout> </RelativeLayout>
最后,附上 demo 的下载链接 (免费):
http://download.csdn.net/detail/chang_1134/9517307
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories