Android Listview動態加載數據

openkk 12年前發布 | 83K 次閱讀 Android Android開發 移動開發

在研究網絡數據加載的問題,比如我有幾百,甚至上千條數據,這些數據如果一次性全部加載到arraylist,然后再加載到Listview中。我們必然會去單獨開線程來做,這樣造成的結果就是會出現等待時間很長,用戶體驗非常不好。我的想法是動態加載數據,第一次加載十條,然后往下面滑動的時候再追加十條,再往下面滑動的時候再去追加,這樣大大減少了用戶等待的時間,同時給處理數據留下了時間。網上看到了這樣一個例子,挺好的,我改動了一下,達到了我想要的結果。

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout.LayoutParams;

public class ListViewForLoading extends Activity implements OnScrollListener {

private listViewAdapter adapter = new listViewAdapter();
ListView listView;
LinearLayout loadingLayout;
private Thread mThread;
/**
 * 設置布局顯示屬性
 */
private LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.WRAP_CONTENT,
        LinearLayout.LayoutParams.WRAP_CONTENT);
/**
 * 設置布局顯示目標最大化屬性
 */
private LayoutParams FFlayoutParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT,
        LinearLayout.LayoutParams.FILL_PARENT);

private ProgressBar progressBar;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();
}

private void init() {
    // TODO Auto-generated method stub
    // 線性布局
    LinearLayout layout = new LinearLayout(this);
    // 設置布局 水平方向
    layout.setOrientation(LinearLayout.HORIZONTAL);
    // 進度條
    progressBar = new ProgressBar(this);
    // 進度條顯示位置
    progressBar.setPadding(0, 0, 15, 0);
    // 把進度條加入到layout中
    layout.addView(progressBar, mLayoutParams);
    // 文本內容
    TextView textView = new TextView(this);
    textView.setText("加載中...");
    textView.setGravity(Gravity.CENTER_VERTICAL);
    // 把文本加入到layout中
    layout.addView(textView, FFlayoutParams);
    // 設置layout的重力方向,即對齊方式是
    layout.setGravity(Gravity.CENTER);

    // 設置ListView的頁腳layout
    loadingLayout = new LinearLayout(this);
    loadingLayout.addView(layout, mLayoutParams);
    loadingLayout.setGravity(Gravity.CENTER);

    // 得到一個ListView用來顯示條目
    listView = (ListView) findViewById(R.id.tv);
    // 添加到腳頁顯示
    listView.addFooterView(loadingLayout);
    // 給ListView添加適配器
    listView.setAdapter(adapter);
    // 給ListView注冊滾動監聽
    listView.setOnScrollListener(this);
}

/**
 * 要用用于生成顯示數據
 * 
 * @author huangbq
 * 
 */
class listViewAdapter extends BaseAdapter {
    int count = 10;

    public int getCount() {
        return count;
    }

    public Object getItem(int pos) {
        return pos;
    }

    public long getItemId(int pos) {
        return pos;
    }

    public View getView(int pos, View v, ViewGroup p) {
        TextView view;
        if (v == null) {
            view = new TextView(ListViewForLoading.this);
        } else {
            view = (TextView) v;
        }
        view.setText("ListItem " + pos);
        view.setTextSize(20f);
        view.setGravity(Gravity.CENTER);
        view.setHeight(60);
        return view;
    }
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    // TODO Auto-generated method stub
    if(firstVisibleItem+visibleItemCount==totalItemCount)
    {
        //開線程去下載網絡數據
        if (mThread == null || !mThread.isAlive()) {
            mThread = new Thread() {
                @Override
                public void run() {
                    try {
                        //這里放你網絡數據請求的方法,我在這里用線程休眠5秒方法來處理
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Message message = new Message();
                    message.what = 1;
                    handler.sendMessage(message);
                }
            };
            mThread.start();                
        }
    }
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    // TODO Auto-generated method stub        
}

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        switch (msg.what) {
        case 1:
            if (adapter.count <= 41) {
                adapter.count += 10;
                int currentPage = adapter.count / 10;
                Toast.makeText(getApplicationContext(),"第" + currentPage + "頁", Toast.LENGTH_LONG).show();
            } else {
                listView.removeFooterView(loadingLayout);
            }
            //重新刷新Listview的adapter里面數據
            adapter.notifyDataSetChanged();
            break;
        default:
            break;
        }
    }

};

}</pre>

運行結果如下圖:

Android Listview動態加載數據

Android Listview動態加載數據

Android Listview動態加載數據

轉自:http://www.cnblogs.com/tanlon/archive/2011/03/20/1989323.html

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!