解决ListView中包含EditText数据混乱原理
2017-06-29 09:55
435 查看
要求:屏幕中显示一个listview,其中每一个item都有一个editText,在任一editText上输入内容,快速上下滑动,保证数据不混乱。
这是一道面试题,初看没什么,应该会很简单,但实际解决起来没那么简单,先上解决代码。
package com.zhiren.mytestok;
import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import java.util.List;
/**
* Created by Administrator on 2017/2/20.
*/
public class MyAdapters extends BaseAdapter {
private Context context;
// private String[] str;
private List list;
public MyAdapters(Context context, List list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.item_mian, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Bean bean = (Bean) list.get(position);
Log.e("TAG", viewHolder.text + ":" + position);
viewHolder.text.setTag(position);
viewHolder.text.clearFocus();
viewHolder.text.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) {
int pos = (int) viewHolder.text.getTag();
Bean b = (Bean) list.get(pos);
b.setName(s + "");
}
@Override
public void afterTextChanged(Editable s) {
}
});
if (!TextUtils.isEmpty(bean.getName())) {
viewHolder.text.setText(bean.getName());
} else {
viewHolder.text.setText("");
}
return convertView;
}
public class ViewHolder {
private EditText text;
public ViewHolder(View v) {
text = (EditText) v.findViewById(R.id.et_item);
}
}
}
解释:
通过打印log可以看到,屏幕中最多可以显示7行item,下标依次为:0、1、2、3、4、5、6.
其中下标为0的item的地址值是3098e6e5
通过向上滑动,当出现第8行item(下标为7)的时候,下标为0的item已经完全看不到了,根据谷歌设计原理,下标为0的item复用到了刚刚出现的下标为7的item上,其中可以看到下标为7的item的地址值也是3098e6e5,以上可以证明。这些都是大家知道的,重点看下面:
为什么要写
[code=java;toolbar:false">
这是一道面试题,初看没什么,应该会很简单,但实际解决起来没那么简单,先上解决代码。
package com.zhiren.mytestok;
import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import java.util.List;
/**
* Created by Administrator on 2017/2/20.
*/
public class MyAdapters extends BaseAdapter {
private Context context;
// private String[] str;
private List list;
public MyAdapters(Context context, List list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = View.inflate(context, R.layout.item_mian, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Bean bean = (Bean) list.get(position);
Log.e("TAG", viewHolder.text + ":" + position);
viewHolder.text.setTag(position);
viewHolder.text.clearFocus();
viewHolder.text.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) {
int pos = (int) viewHolder.text.getTag();
Bean b = (Bean) list.get(pos);
b.setName(s + "");
}
@Override
public void afterTextChanged(Editable s) {
}
});
if (!TextUtils.isEmpty(bean.getName())) {
viewHolder.text.setText(bean.getName());
} else {
viewHolder.text.setText("");
}
return convertView;
}
public class ViewHolder {
private EditText text;
public ViewHolder(View v) {
text = (EditText) v.findViewById(R.id.et_item);
}
}
}
解释:
通过打印log可以看到,屏幕中最多可以显示7行item,下标依次为:0、1、2、3、4、5、6.
其中下标为0的item的地址值是3098e6e5
通过向上滑动,当出现第8行item(下标为7)的时候,下标为0的item已经完全看不到了,根据谷歌设计原理,下标为0的item复用到了刚刚出现的下标为7的item上,其中可以看到下标为7的item的地址值也是3098e6e5,以上可以证明。这些都是大家知道的,重点看下面:
为什么要写
[code=java;toolbar:false">
相关文章推荐
- Android 解决在ListView历史复用中Edittext数据显示混乱
- ListView中嵌入一个或多个EditText导致数据混乱解决方法
- Android 解决在ListView历史复用中Edittext数据显示混乱
- 二、Android 解决在ListView历史复用中Edittext数据显示混乱
- Android中解决在ListView历史复用中Edittext数据显示混乱
- Android 解决在ListView历史复用中Edittext数据显示混乱
- Android 解决ListView里面多套布局多个EditText数据混乱问题
- listView中放入EditText滑动listView时,EditText中数据混乱解决方案
- Android 解决ListView中有EditText时,数据丢失问题
- 关于ListView中包含EditText数据复用引起异常的解决方案
- Android 解决Listview条目里面有Edittext数据错乱问题
- 关于ListView中包含EditText数据复用引起异常的解决方案
- ExpandableListView、ListView EditText 输入数据混乱的问题
- Android RecyclerView 中多Item的EditText焦点混乱,数据错乱的解决方法(更新)
- 关于ListView中包含EditText数据复用引起异常的解决方案
- ListView item中含 EditText,焦点冲突解决
- Android 中listView数据混乱的原因以及解决方法
- Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
- 使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
- android基础教程之android的listview与edittext冲突解决方法