Android listview控件在Android项目的开发中使用是很频繁的,本意是用作信息展示的,但是在实际的开发中,可能会被赋予跟多的功能,比如嵌套edittext,做一个批量填写,虽然这样很方便,但是由于listview自身的复用特性,在使用的过程中,会出现填写的数据在滑动的过程中出现错位的情况。这就很让人头疼了,在网上搜索了一些解决方法,最普遍的就是通过设置标签来解决。本人也试过,确实可行,这里就不介绍了。主要介绍一下自己总结的办法,希望可以和大家交流一下。
先贴出BaseAdapter中的代码:
class MyAdapter extends BaseAdapter{
class Message{
TextView text;
EditText edit;
int position;
public Message(View view) {
// TODO Auto-generated constructor stub
text = (TextView) view.findViewById(R.id.lkf_listview_view_tv);
edit = (EditText) view.findViewById(R.id.lkf_listview_view_ed);
}
}
public MyAdapter() {
// TODO Auto-generated constructor stub
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final Message msg;
//绘制布局
if(convertView == null){
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.lkf_listview_view, null);
msg = new Message(convertView);
msg.edit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
list.get(msg.position).setValue(s.toString());
}
});
convertView.setTag(msg);
}else{
msg = (Message) convertView.getTag();
}
//标记(关键)
msg.position = position;
//展示数据
if(list.get(position).getMessage() != null){
msg.text.setText(list.get(position).getMessage());
}else{
msg.text.setText("没有数据");
}
//展示需要保存的数据,在类中加上属性(关键)
if(list.get(position).getValue() != null){
msg.edit.setText(list.get(position).getValue());
}else{
msg.edit.setText("");
}
return convertView;
}
}
讨论:在通过打印日志,发现出现错位的原因就是position。
现在我们假设一共需要展示10条数据,但是屏幕只能显示5条item,在初始化listview的时候,position会被赋予从0-9的10个数,但是当你向上滑动一个item的时候,按照我们看到的,这个时候我们看到的新出现的item所对应的position该是5,但事实真是这样吗?通过日志打印position我们可以看到,这个新出现的item所对应的position并不是5,这就是因为listview会复用item所造成的,那我们怎么才能保证得到我们想要的position呢,那就把它记录下来啊,需要的时候就取出我们记录的数据,这样我们就不会受position的干扰了。记录方法如上面的代码,这是我总结的方法,有什么不对的还请多多指教。
源码下载地址:http://download.csdn.net/detail/lkyphoon/9738793