Android 关于adapter自动检测数据源变化

昨天遇到了一个问题,今天忙了一天 问了好多人,最后也没有个所以然。最后偶然间发现了问题,解决了  并产生了一系列的猜想,做了个小实验,并且验证了猜想  

在这里跟大家分享一下


我的猜想是:adapter能够在setAdapter方法没有执行完的时候检测数据源的变化,并对之做出反应,继续加载新的数据源。  挺简单的东西,底层是什么深层原理,我是小白钻不下去,只是把自己遇到的收获的跟大家分享一下,下面贴出来我试验的代码(运行以后上下拉动,看看效果(其他的自己思考,有什么新发现欢迎一起讨论)):

布局很简单,只有一个listview   item布局只写了一个textView

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


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;


public class MainActivity extends Activity {


private ListView listview;
private MyAdapter adapter;
List str=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
initData();
listview.setAdapter(adapter);
}

public void initView(){
listview=(ListView) findViewById(R.id.lv);
adapter=new MyAdapter();
}

public void initData(){
str.add("你");
str.add("是");
str.add("个");
str.add("好");
}

public class MyAdapter extends BaseAdapter{


@Override
public int getCount() {
// TODO Auto-generated method stub
return str.size();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder=null;
if (convertView==null) {
convertView=View.inflate(MainActivity.this, R.layout.item, null);
holder=new ViewHolder();

holder.vh_tv=(TextView) convertView.findViewById(R.id.tv);

convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}

if (position==3) {
str.remove("你");
str.remove("是");
str.remove("个");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");
str.add("好");
str.add("人");

}

holder.vh_tv.setText(str.get(position));

return convertView;
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}


}

public class ViewHolder{
private TextView vh_tv;
}


}



建议在通过耗时操作获取数据源的时候,setAdapter前确保此时的数据源是你想要的那个数据源,否则说不定在你setAdapter方法已经开始执行了,数据源才过来(这时候adapter自动刷新数据源。。。 会把之前数据源的一部分和新的数据源一起加载,并且滑动过程中,之前的数据源的条目会消失);

我之前是因为代码逻辑的特殊性产生了很坑爹的现象  问了好多人都解决不了

你可能感兴趣的:(android,listview,adapter)