android Listview下拉滚动时自动加载数据

来源:互联网 发布:vb索引超出了数组界限 编辑:程序博客网 时间:2024/06/06 07:30

  最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到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;            }        }    };}

运行结果如下图:


原创粉丝点击