您的位置:首页 > 其它

解决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">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: