Alan Moment
  • Introduction
  • 智慧家庭
    • Fibaro 系統整合便宜的 IP Cam
  • Life
    • 用AWS Glacier做最後的冷資料備份
    • 如何在macOS修改影音檔日期
  • 3D Printer
    • Atom2.5EX 之血淚組裝
    • 列印經驗紀錄
      • SpoolHolder
    • 製圖經驗
      • Turntable
      • 重製Atom3散熱風扇
    • 線材經驗
      • PETG
        • 首測
  • Kubernetes
    • 使用Kops建立Kubernetes
    • 使用HelmV2
    • Kubernetes的技術問題排解技巧
  • PHP
    • 管理PHP Library的利器Composer
    • PHP安裝JSON
    • Phalcon首發
    • Gearman Job Worker for PHP
    • Laravel 首發 !!!
    • Data Encrypt & Decrypt
  • Python
    • Django + Python 開發環境建置
  • Android
    • Android zipcode library of maven
    • Android use foreign object of OrmLite
    • ProgressBar while loading ListView of Android
    • AsyncTask download image by the Android
    • Use Thread control Android UI
    • Android Universal Image Loader
  • Ruby on Rails
    • Install rmagick on the Windows of Ruby on Rails
    • Ruby on Rails deploy on Heroku
    • Ruby on Rails 小問題
  • React
    • Ditched AngularJS for React
  • Tessel
    • 很潮的 Tessel
    • Connect to Slack on Tessel
    • Baby Help on Tessel
  • Node.js
    • CentOS 安装 Node.js 0.8.5
  • OOAD
    • Injection Principle Design Pattern
  • Linux
    • SSH免密碼登入遠端電腦
    • Apache與Tomcat的結合
    • The bash auto build
  • Hadoop
    • CentOS 5.5 + Hadoop 0.20
    • CentOS 5.5 + Hbase 0.94.8
    • Hadoop + Hbase 叢集環境
    • Hadoop 溝通橋梁之 Thrift 0.7
    • 使用MapReduce之替代方案Hive
    • 使用Sqoop將MySQL資料匯入Hbase
  • Database
    • 吃足苦頭的Mssql
  • IDE
    • Netbeans console中文亂碼解決方法
    • 用NetBeans開發Ruby On Rails
  • Agile
    • 淺談我的Agile
  • 協作工具
    • 建置專屬自己的Github之Gitlab
    • Gitlab 4.1 upgrade to Gitlab 6.0超偷懶方法
    • Install Phabricator and run on the Gitlab
    • Phabricator 基本應用
    • Phabricator review code應用
    • Redmine之基本建置與Scrum應用
    • Omnibus Gitlab 7 基礎操作
    • Git Push Notify to Slack on Gitlab
    • phabricator-extensions-Sprint 無法抓到正確的 Story Points
  • 其他
    • 慶祝Octopress開張
    • 走在時尚的尖端! Ghost
    • 大搬家
    • 網頁教學初體驗
    • 網路攻擊很猖狂
Powered by GitBook
On this page

Was this helpful?

  1. Android

ProgressBar while loading ListView of Android

ListView通常是用來顯示列表的Widget,但是一般不可能直接從不管是遠端的Database或是Sqlite撈出全部的資料然後直接顯示,一定是分批撈取分批顯示。

這時就需要一個Loading畫面讓Client知道說,當前正在載入資料。不管是跳Dialog或是像Facebook一樣在畫面Bottom顯示Loading layout都可以。

我採取的是像Facebook一樣的方式呈現。

建立MainActivity.java

simpleAdapter可另外設置R.layout.listview_item讓ListView中的資料吃別隻xml。

package com.example.test;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.AbsListView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends Activity {

  private String TAG_LOG = MainActivity.class.getName();
  // ViewList需要用到的制定鍵值
  String[] adapterKey;
  // ViewList需要用到的制定鍵值
  int[] adapterViewKey;
  // 顯示讀取畫面的容器
  LinearLayout loadingLayout;
  // 顯示列表的容器
  ListView listView;
  // 列表
  SimpleAdapter simpleAdapter;
  // 列表資料
  List<map object>> items = new ArrayList<map object>>();

  /**
  * 取資料
  * @param items
  * @return
  */
  private List<map object>> getData(List<map object>> items, String[] adapterKey)
  {
    Integer limitCount = items.size() + 10;
    for (Integer count = items.size(); count<limitcount count map object> item = new HashMap<string object>();
        item.put(adapterKey[0], count+1);
        items.add(item);
    }
    return items;
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listView);

    // 設定ListView相對應的View
    adapterKey = new String[]{"number"};
    adapterViewKey = new int[]{R.id.txtNumber};

    // 取得資料並且設定Adapter
    items = getData(items, adapterKey);
    simpleAdapter = new SimpleAdapter(
      MainActivity.this,
      items,
      R.layout.listview_item,
      adapterKey,
      adapterViewKey
    );


    // Set loading view before of set setAdapter
    loadingLayout = getLoadingLayout(MainActivity.this, null);
    listView.addFooterView(loadingLayout);
    listView.setAdapter(simpleAdapter);
    listView.setOnScrollListener(moreItemScrollListener);
  }

  // 已經到資料結尾
  boolean isEnd = false;

  /**
  * 聆聽往上滑動讀取更多物件的事件,會在下方顯示讀取狀態
  */
  private AbsListView.OnScrollListener moreItemScrollListener = new AbsListView.OnScrollListener() {

  // 可以再次載資料
  boolean canLoadData = false;
  // 在讀取資料中
  boolean isLoadingMode = false;

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

    //如果不是在讀取資料的狀態、還有資料可以讀取
    if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0 && !isLoadingMode && !isEnd) {
      canLoadData = true;
      Log.d(TAG_LOG, "can load");
    }
  }

  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {

    //當ListView拉到底,且沒在載入資料時,而且還有資料可以讀取
    if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && canLoadData && !isLoadingMode && !isEnd) {
      // 再次撈取資料前先關閉可以撈取資料的狀態
      Log.d(TAG_LOG, "loading");
      isLoadingMode = true;
      loadMoreData();

      //通知Adapter更新
      simpleAdapter.notifyDataSetChanged();
      canLoadData = false;
      isLoadingMode = false;
    }
  }

  /**
  * 處理要求更多物件
  */
  private void loadMoreData() {
    if (this.items.size() = 30 && !isEnd) {
      isEnd = true;
      this.listView.removeFooterView(this.loadingLayout);
      Log.d(TAG_LOG, "can't load again");
    }
  }

  /**
  * Get loading view layout object
  *
  * @param context
  * @param msg
  * @return LinearLayout
  */
  public LinearLayout getLoadingLayout(Context context, String msg) {
    if (msg == null || msg == "")
      msg = context.getResources().getString(R.string.loading_text);

    Log.d("Util", "Loading screen");
    LinearLayout.LayoutParams WClayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    LinearLayout.LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);

    LinearLayout layout = new LinearLayout(context);
    layout.setOrientation(LinearLayout.HORIZONTAL);
    ProgressBar progressBar = new ProgressBar(context);
    progressBar.setPadding(0, 0, 15, 0);
    layout.addView(progressBar, WClayoutParams);

    TextView textView = new TextView(context);
    textView.setText(msg);
    textView.setGravity(Gravity.CENTER_VERTICAL);

    layout.addView(textView, FFlayoutParams);
    layout.setGravity(Gravity.CENTER);

    LinearLayout loadingLayout = new LinearLayout(context);
    loadingLayout.addView(layout, WClayoutParams);
    loadingLayout.setGravity(Gravity.CENTER);

    return loadingLayout;
  }
}

getLoadingLayout函式是用在當手勢往上滑畫面在最底部時要顯示讀取資料中的Loading畫面。

Loading layout並不是當讀取時才出現,而是他一直置於ListView最底部,所以讀取不到資料時要將Loading layout移除

this.listView.removeFooterView(this.loadingLayout);

執行後就會是這樣

Oct 11th, 2013 10:24:00am

PreviousAndroid use foreign object of OrmLiteNextAsyncTask download image by the Android

Last updated 3 years ago

Was this helpful?

Loading
Loading end