Android Listview动态加载数据

来源:互联网 发布:淘宝店释放是什么意思 编辑:程序博客网 时间:2024/05/16 05:13
 
在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好。我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间。网上看到了这样一个例子,挺好的,我改动了一下,达到了我想要的结果。
001import android.app.Activity;
002import android.os.Bundle;
003import android.os.Handler;
004import android.os.Message;
005import android.view.Gravity;
006import android.view.View;
007import android.view.ViewGroup;
008import android.widget.AbsListView;
009import android.widget.BaseAdapter;
010import android.widget.LinearLayout;
011import android.widget.ListView;
012import android.widget.ProgressBar;
013import android.widget.TextView;
014import android.widget.Toast;
015import android.widget.AbsListView.OnScrollListener;
016import android.widget.LinearLayout.LayoutParams;
017  
018public class ListViewForLoading extendsActivity implementsOnScrollListener {
019  
020    privatelistViewAdapter adapter = newlistViewAdapter();
021    ListView listView;
022    LinearLayout loadingLayout;
023    privateThread mThread;
024    /**
025     * 设置布局显示属性
026     */
027    privateLayoutParams mLayoutParams = newLinearLayout.LayoutParams(
028            LinearLayout.LayoutParams.WRAP_CONTENT,
029            LinearLayout.LayoutParams.WRAP_CONTENT);
030    /**
031     * 设置布局显示目标最大化属性
032     */
033    privateLayoutParams FFlayoutParams = newLinearLayout.LayoutParams(
034            LinearLayout.LayoutParams.FILL_PARENT,
035            LinearLayout.LayoutParams.FILL_PARENT);
036  
037    privateProgressBar progressBar;
038  
039    /** Called when the activity is first created. */
040    @Override
041    publicvoid onCreate(Bundle savedInstanceState) {
042        super.onCreate(savedInstanceState);
043        setContentView(R.layout.main);
044        init();
045    }
046  
047    privatevoid init() {
048        // TODO Auto-generated method stub
049        // 线性布局
050        LinearLayout layout =new LinearLayout(this);
051        // 设置布局 水平方向
052        layout.setOrientation(LinearLayout.HORIZONTAL);
053        // 进度条
054        progressBar =new ProgressBar(this);
055        // 进度条显示位置
056        progressBar.setPadding(0,0, 15,0);
057        // 把进度条加入到layout中
058        layout.addView(progressBar, mLayoutParams);
059        // 文本内容
060        TextView textView =new TextView(this);
061        textView.setText("加载中...");
062        textView.setGravity(Gravity.CENTER_VERTICAL);
063        // 把文本加入到layout中
064        layout.addView(textView, FFlayoutParams);
065        // 设置layout的重力方向,即对齐方式是
066        layout.setGravity(Gravity.CENTER);
067  
068        // 设置ListView的页脚layout
069        loadingLayout =new LinearLayout(this);
070        loadingLayout.addView(layout, mLayoutParams);
071        loadingLayout.setGravity(Gravity.CENTER);
072  
073        // 得到一个ListView用来显示条目
074        listView = (ListView) findViewById(R.id.tv);
075        // 添加到脚页显示
076        listView.addFooterView(loadingLayout);
077        // 给ListView添加适配器
078        listView.setAdapter(adapter);
079        // 给ListView注册滚动监听
080        listView.setOnScrollListener(this);
081    }
082  
083    /**
084     * 要用用于生成显示数据
085     
086     * @author huangbq
087     
088     */
089    classlistViewAdapter extendsBaseAdapter {
090        intcount = 10;
091  
092        publicint getCount() {
093            returncount;
094        }
095  
096        publicObject getItem(intpos) {
097            returnpos;
098        }
099  
100        publiclong getItemId(intpos) {
101            returnpos;
102        }
103  
104        publicView getView(intpos, View v, ViewGroup p) {
105            TextView view;
106            if(v == null) {
107                view =new TextView(ListViewForLoading.this);
108            }else {
109                view = (TextView) v;
110            }
111            view.setText("ListItem "+ pos);
112            view.setTextSize(20f);
113            view.setGravity(Gravity.CENTER);
114            view.setHeight(60);
115            returnview;
116        }
117    }
118  
119    @Override
120    publicvoid onScroll(AbsListView view,int firstVisibleItem,
121            intvisibleItemCount, inttotalItemCount) {
122        // TODO Auto-generated method stub
123        if(firstVisibleItem+visibleItemCount==totalItemCount)
124        {
125            //开线程去下载网络数据
126            if(mThread == null|| !mThread.isAlive()) {
127                mThread =new Thread() {
128                    @Override
129                    publicvoid run() {
130                        try{
131                            //这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
132                            Thread.sleep(5000);
133                        }catch (InterruptedException e) {
134                            e.printStackTrace();
135                        }
136                        Message message =new Message();
137                        message.what =1;
138                        handler.sendMessage(message);
139                    }
140                };
141                mThread.start();                
142            }
143        }
144    }
145  
146    @Override
147    publicvoid onScrollStateChanged(AbsListView view,int scrollState) {
148        // TODO Auto-generated method stub        
149    }
150  
151    privateHandler handler = newHandler() {
152        @Override
153        publicvoid handleMessage(Message msg) {
154            // TODO Auto-generated method stub
155            switch(msg.what) {
156            case1:
157                if(adapter.count <= 41) {
158                    adapter.count +=10;
159                    intcurrentPage = adapter.count / 10;
160                    Toast.makeText(getApplicationContext(),"第"+ currentPage + "页", Toast.LENGTH_LONG).show();
161                }else {
162                    listView.removeFooterView(loadingLayout);
163                }
164                //重新刷新Listview的adapter里面数据
165                adapter.notifyDataSetChanged();
166                break;
167            default:
168                break;
169            }
170        }
171  
172    };
173}

运行结果如下图:

Android Listview动态加载数据

Android Listview动态加载数据

Android Listview动态加载数据

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

原创粉丝点击