類Android網易新聞之新聞閱讀器製作(2)

來源:互聯網
上載者:User

完成splash之後,便開始製作列表頁。就像之前說的,列表頁具有更新和分頁的功能,這兩個功能都是很常見的。為了使列表支援拖動重新整理功能,這裡我用到了一個開源外掛程式PullToRefreshListView,這個開源的組件可以使列表頁擁有拖動更新的功能。

這是由 johannilsson 以及眾位其好友的研究成果,並已 Apache 2.0 協議開源託管在 Github:https://github.com/johannilsson/android-pulltorefresh,具體如下:

 

他的原理是繼承listview,並利用headview,配合上ontouch和onscroll來檢測使用者下拉和上滑的動作來實現這種效果。

有了PullToRefreshListView之後,我們的列表就有了下拉更新功能,再配合上footview我們就可以實現分頁功能了。至此,UI部分沒什麼好講的。再來看看背景工作執行緒,我們大概要建立兩個背景工作執行緒,一個負責更新,一個負責取當前列表及其分頁。

這裡我們既可以使用Thread+Handler+Message的方式,也可以是用AsyncTask來建立背景工作執行緒,

如更新部分我們使用了AsyncTask:


private class GetDataTask extends AsyncTask<Void, Void, List<News>> {
    @Override
    protected List<News> doInBackground(Void params) {
        // Simulates a background job.
        // 更新擷取資料
        try {
            if (ApplicationEx.isNetworkConnected(CiReader.this)) {
            List<News> updatelist = HttpDataService
            .getNewsListForUpdate(CiReader.this, cur_tab,
                            firstItem, LIMIT);
            // 儲存
            if (updatelist != null && !updatelist.isEmpty()) {
                Iterator<News> iter = updatelist.iterator();
                while (iter.hasNext()) {
                     News news = iter.next();
                     news.storageNews(CiReader.this);
                    ((LinkedList<News>) list).addFirst(news);
                }
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    @Override
    protected void onPostExecute(List<News> result) {
        // mListItems.addFirst("Added after refresh");
        if (!ApplicationEx.isNetworkConnected(CiReader.this)) {
            Tools.displayMsg(CiReader.this, "無網路連接");
        }
        // Call onRefreshComplete when the list has been refreshed.
        pulltorefreshlist.onRefreshComplete();
        super.onPostExecute(result);
    }
}
取列表及分頁資料的AsyncTask:

class MoreAsyncTask extends AsyncTask<Void, Void, List<News>> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        loadingbutton.setText("正在載入");
        System.out.println("pre");
    }

    protected List<News> doInBackground(Void arg0) {
        // TODO Auto-generated method stub

        // 取最新20條
        List<News> addlist = DBUtil.getNewsListByCategory(CiReader.this,
                cur_tab, lastItem, LIMIT);
        if (addlist == null || addlist.isEmpty()) {
            // 申請網路,取20條資料,沒有任何資料,
            // 在splash裡面完成前20條資料的載入
            if (ApplicationEx.isNetworkConnected(CiReader.this)) {
                addlist = HttpDataService.getNewsList(CiReader.this,
                        cur_tab, lastItem, LIMIT);
                // 儲存
                if (addlist != null && !addlist.isEmpty()) {
                    Iterator<News> iter = addlist.iterator();
                    while (iter.hasNext()) {
                        News news = iter.next();
                        news.storageNews(CiReader.this);
                    }
                }
                System.out.println("test3");
            } else {
                // 無網路連接
            }
        } else if (addlist.size() < LIMIT) {
            // 申請網路,去取不足的部分,這時需要得到
            // 第一條資料的content_file_name這個欄位值
            if (ApplicationEx.isNetworkConnected(CiReader.this)) {
                lastItem = addlist.get(addlist.size() - 1)
                        .getContent_file_name();
                List<News> addlist2 = HttpDataService.getNewsList(
                        CiReader.this, cur_tab, lastItem,
                        LIMIT - addlist.size());
                if (addlist2 != null && !addlist2.isEmpty()) {
                    addlist.addAll(addlist2);
                    Iterator<News> iter2 = addlist2.iterator();
                    while (iter2.hasNext()) {
                        News news = iter2.next();
                        news.storageNews(CiReader.this);
                    }
                }
            } else {
                // 無網路連接
            }
        }

        if (addlist != null && !addlist.isEmpty()) {
            list.addAll(addlist);
            News lastnews = addlist.get(addlist.size() - 1);
            lastItem = lastnews.getContent_file_name();
        }

        System.out.println("back");
        return addlist;

    }

    @Override
    protected void onPostExecute(List<News> result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        System.out.println("post");
        if (result != null && !result.isEmpty()) {
            loadingbutton.setText("查看下面20條結果");
            footview.setVisibility(View.GONE);
        } else if (!ApplicationEx.isNetworkConnected(CiReader.this)) {
            Tools.displayMsg(CiReader.this, "無網路連接");
        } else {

            loadingbutton.setText("沒有了");
            loadingbutton.setOnClickListener(null);
        }
    }

}分頁是利用了footview來顯示的:
private class scrollListener implements OnScrollListener{
       
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub
           
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub
            switch (scrollState){
            case OnScrollListener.SCROLL_STATE_IDLE:
                if (view.getLastVisiblePosition() == (view.getCount() - 1)){
                    footview.setVisibility(View.VISIBLE);
                }              
            }       
        }
    }
}   


講到這裡列表頁的關鍵問題就講完了,代碼裡面還有涉及到從網路取資料存本機資料庫的部分。這又涉及到一些sqlite的操作,這個可以放到後面再講一些自己的心得。下面一講將內容頁是如何製作的。

 

作者“風之子的部落格”

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.