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

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值