Android_listview分页加载更多

只要使用listview,那么listview的异步加载是必不可少的.
我们知道,如果整个手机屏幕只能完整显示10条记录,那么adapter的getView就会调用10次,
也就是说,手机屏幕显示了几条数据,那么getView就会被调用几次…这个例子待会将会演示,注意往回看也是一样的,
也就是listview把以前的显示过的已经被回收了,这样就可以显示更多的条目了.所以这里需要listview优化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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) {
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<span style="white-space:pre">      </span>System.out.println("我是getView,我被调用了"); 
        <span style="background-color: rgb(255, 153, 102);">if (convertView == null) { 
            convertView = LayoutInflater.from(mContext).inflate( 
                    R.layout.article_list_item, null); 
        }</span> 
        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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@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) { 
        <span style="color:#ff0000;">adapter.notifyDataSetChanged();</span> 
    
}

标签