只要使用listview,那么listview的异步加载是必不可少的.
我们知道,如果整个手机屏幕只能完整显示10条记录,那么adapter的getView就会调用10次,
也就是说,手机屏幕显示了几条数据,那么getView就会被调用几次...这个例子待会将会演示,注意往回看也是一样的,
也就是listview把以前的显示过的已经被回收了,这样就可以显示更多的条目了.所以这里需要listview优化
public class ArticleListAdapter extends BaseAdapter { private List<Article> mArticles; private Context mContext; static View view = null; public ArticleListAdapter(Context context, List<Article> articles) { this.mArticles = articles; this.mContext = context; } @Override public int getCount() { return mArticles.size(); } @Override public Object getItem(int position) { return mArticles.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("我是getView,我被调用了"); if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( R.layout.article_list_item, null); } view = convertView; Article article = mArticles.get(position); TextView textView = (TextView) view.findViewById(R.id.tv_article_title); textView.setText(article.getTitle()); return view; } }
现在我们来验证一下关于listview优化的问题.
从上一张图可以看出,显示了6个条目,现在在看看控制台输出情况:
也就是getView被调用了6次,并且当我们不断的把listview往下拉,getView不断的被调用.
也就是显示一次调用一次! 比如第一次调用了6次,那么就创建了6个view对象,
并且getView的convertView参数就是代表老的view对象,
这里我们为了避免重复创建对象可以使用如上的Adapter使用方式,判断convertView是否为空,如果不为空则复用老对象...
现在再来看看listview的异步加载,其实异步加载很简单,我们知道listview肯定会对应一个Adapter,Adapter对应一个集合,
我们只需要改变这个集合即可.比如,第一次加载了10,那么当加载更多的时候,只需要把又加载到的10条记录加到集合即可,
然后再调用adapter.notifyDataSetChanged()方法即可..listview就会在原来的的基础上加载10条,代码如下
这里用的AsyncTask
@Override
protected Object doInBackgroundTask2(String... params) {//在子线程执行
String url = params[0];
Source subSource = getSource(url);
int index = pager * 25;
List<Article> articles = articleDao.getArticleByParentIDPage(index,
parent_id);
if (articles != null && articles.size() == 25) {
mSubArticles.addAll(articles);
} else {
if (subSource == null)
return null;
List<Element> subElements = subSource
.getAllElementsByClass("leftList").get(1)
.getChildElements().get(0).getChildElements();
int subSize = subElements.size();
for (int i = 0; i < subSize; i++) {
Article sub = new Article();
Element href = subElements.get(i).getFirstElement("a");
String link = href.getAttributeValue("href");
String title = href.getTextExtractor().toString().trim();
sub.setTitle(title);
sub.setLink(link, true);
mSubArticles.add(sub);
// 缓存到本地数据库
if (parent_id != -1) {
sub.setId(parent_id);
articleDao.add(sub);
}
}
}
Element custom = subSource.getAllElementsByClass("custom").get(0);
pager_info = custom.getRenderer().toString();
return custom;
}
@Override
protected void onPostTask2(Object result) {//执行完doInBackgroundTask2后,执行该方法
//pd_tip.setVisibility(View.GONE);
pd.dismiss();
load_more_view.setVisibility(View.VISIBLE);
if (result == null)
return;
load_more.setText(pager_info);
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
欢迎转载: http://write.blog.csdn.net/postedit/7634238