现在的位置: 首页 > 综合 > 正文

Android_listview分页加载更多

2013年10月02日 ⁄ 综合 ⁄ 共 2718字 ⁄ 字号 评论关闭

只要使用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

抱歉!评论已关闭.