带EditText的ListView

前言:项目中遇到ListView中包含EditText的需求,并且附带删除和添加item功能,遇到了坑,在工作的时候虽然解决了,但是总感觉解决的方法不完美,现在项目基本完成了,空下时间来看看这块
![这里写图片描述](https://img-blog.csdn.net/20160801181849143)

项目的基本需求就是这个样子的,当然没这么丑。但是大概的功能都包含了,
1,可以根据已有数据填充
2,可修改数据
3,可增加条目
4,可删除条目

先展示整体的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.litteyes.listedittextdemo.MainActivity">

    <Button
        android:id="@+id/add_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="添加一条" />

    <ListView
        android:id="@+id/edit_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

一个添加item的Button,一个展示数据的ListView
然后再看一下布局文件

<?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="60dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/postion_txt"
        android:layout_width="wrap_content"
        android:layout_height="60dp" />

    <EditText
        android:id="@+id/content_edit"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_marginLeft="15dp" />

    <Button
        android:id="@+id/delet_btn"
        android:layout_width="80dp"
        android:layout_height="60dp"
        android:layout_marginLeft="15dp"
        android:text="删除" />

</LinearLayout>

这里为了好看数据,所以我给每个item添加了一个postion_txt,来展示是第几条

接下来就看看再Activity中怎么实现的吧

package com.litteyes.listedittextdemo;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends FragmentActivity {

    private String[] mData = {"我们说好的", "一辈子的孤单", "不在联系", "那又如何", "如果爱下去", "你的样子", "或者", "悟空", "默", "陪你度过漫长岁月", "没离开过", "花房姑娘", "一无所有", "She‘gone", "相爱一场", "当我们"};
    private ListView mListView;
    private EditListAdapter mAdapter;
    private Button mAddBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAddBtn = (Button) findViewById(R.id.add_btn);
        mListView = (ListView) findViewById(R.id.edit_lv);
        mAdapter = new EditListAdapter();
        mListView.setAdapter(mAdapter);
        mAdapter.setData(initData());

        mAddBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mAdapter.addItem();
            }
        });

    }

    private List<EditListAdapter.SongBean> initData() {
        List<EditListAdapter.SongBean> list = new ArrayList<>();
        for (int i = 0; i < mData.length; i++) {
            EditListAdapter.SongBean bean = new EditListAdapter.SongBean();
            bean.setName(mData[i]);
            list.add(bean);
        }
        return list;
    }
}

ok,基本的做数据,然后放到adapter中,没啥难度,大家扫一眼就好,把所有的代码都上传上去就是我懒得传项目,而且我在看别人的文章的时候,就喜欢这种把所有文件都给好了,然后我粘贴复制,直接能运行的

接下来就是Adapter了,还是直接上代码吧~

package com.litteyes.listedittextdemo;

import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.util.List;

public class EditListAdapter extends BaseAdapter {

    private List<SongBean> mData;


    public void setData(List<SongBean> data) {
        mData = data;
        this.notifyDataSetChanged();
    }

    public void addItem() {
        mData.add(0, new SongBean());
        this.notifyDataSetChanged();
    }

    public void deletItem(int pos) {
        mData.remove(pos);
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mData == null ? 0 : mData.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        //方法一
//        ViewHolder viewHolder = null;
//        if (view == null) {
//            viewHolder = new ViewHolder();
//            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_edit_list, null);
//            viewHolder.posTxt = (TextView) view.findViewById(R.id.postion_txt);
//            viewHolder.contentTxt = (EditText) view.findViewById(R.id.content_edit);
//            viewHolder.deletBtn = (Button) view.findViewById(R.id.delet_btn);
//            view.setTag(viewHolder);
//        } else {
//            viewHolder = (ViewHolder) view.getTag();
//        }
//        viewHolder.posTxt.setText("第" + (position + 1) + "条");
//        viewHolder.contentTxt.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) {
//                Log.e("onTextChanged-----", s.toString());
//                if (mData.get(position).equals(s.toString())) {
//                    return;
//                } else {
//                    mData.get(position).setName(s.toString());
//                }
//            }
//
//            @Override
//            public void afterTextChanged(Editable s) {
//
//            }
//        });
//        viewHolder.contentTxt.setText(mData.get(position).getName());
//        viewHolder.deletBtn.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                deletItem(position);
//            }
//        });
        //方法二
        view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_edit_list, null);
        TextView posTxt = (TextView) view.findViewById(R.id.postion_txt);
        EditText contentTxt = (EditText) view.findViewById(R.id.content_edit);
        Button deletBtn = (Button) view.findViewById(R.id.delet_btn);
        posTxt.setText("第" + (position + 1) + "条");
        contentTxt.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) {
                Log.e("onTextChanged-----", s.toString());
                mData.get(position).setName(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        contentTxt.setText(mData.get(position).getName());
        deletBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deletItem(position);
            }
        });

        return view;
    }

    private class ViewHolder {
        public TextView posTxt;
        public EditText contentTxt;
        public Button deletBtn;

    }

    public static class SongBean {
        private String name;
        private String author;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getAuthor() {
            return author;
        }

        public void setAuthor(String author) {
            this.author = author;
        }
    }
}

其中,方法一是我自己研究的时候用过的,其实就是最常用的Adapter的用法,复用view和ViewHolder,但是发现如果复用View的话,会发现在滑动的时候出现数据乱了的情况,后来想了想,感觉原因在复用View的时候,就使用了第二种方法,发现果然好使

这样的做法当然还是有问题的,因为ListView的特性就没了,如果数据量大的话,肯定会滑动特别慢,但是这也是没办法的事情啦~至少我没想到

对了,忘记提醒大家一下,要给Activity 在Manifest中配上这个属性

android:windowSoftInputMode="adjustPan"

ok就到这吧,希望大家还有更好的办法的,在下面留言,感谢指导

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值