带EditText的ListView
2016-08-01 18:37
92 查看
前言:项目中遇到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就到这吧,希望大家还有更好的办法的,在下面留言,感谢指导
相关文章推荐
- android EditText+ListView的组合(类似于AutoCompleteTextView)
- 【Android】ListView中EditText焦点问题
- 安卓ListView的Item中含有EditText,EditText里面的值保存,并且滑动ListView时EditText值不改变
- EditText动态的刷新Listview显示查询结果
- Listview的itemview中包含edittext控件时的解决方案
- Android ListView的Item中含有EditText,获取EditText里面的值并且刷新ListView值不改变
- ListView中嵌套EditText,直接在EditText输入,需要注意几点
- 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
- android edittext+listview进阶 实现搜索listview中的内容 定制自己的过滤器
- ListView,gallery与内部控件事件冲突以及EditText回退键和回车键失效
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- 解决ListView和 EditText焦点和软键盘问题
- ListView中嵌套的EditText不能滚动的问题
- listview中的item和edittext强焦点问题怎么解决
- 实现qq聊天界面设计 完美解决edittext 软键盘弹出时listview背景不被挤压+listview Item和edittext的相对位置不变
- listview中EditText,焦点问题
- 做项目时一个listview 里面嵌套ediTtext 滑动之后 保存数据
- ListView+EditText
- android edittext,listview里面显示gif动态表情
- android listview 每一项都是edittext 导致的坑爹问题 内容的保存和焦点,光标位置的设置