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

Android 解决ListView中有EditText时,数据丢失问题

2016-05-11 23:05 567 查看
Android开发中,有时可能会碰到ListView中含有EditText的需求,但是EditText这种控件在ListView进行滑动的时候,或者新数据被添加的时候,数据会丢失,解决方法就是,时刻保存数据。

先看看完成后的动态效果图:‘



怎么保存这些数据呢?

其实很简单,就是利用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview EditText