ListView的分页加载

来源:互联网 发布:java归并排序算法 编辑:程序博客网 时间:2024/05/14 23:32

介绍一下ListView的分页加载

一共是三个类,一个是Mainactivity一个是News(数据)一个是MyAdapter(适配器)

要写三个xml文件,一个是activity_main,里面只需要写一个ListView给个id就可以了,第二个是adapter,

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView     android:id="@+id/title"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textSize="23sp"    android:gravity="center_vertical"    android:text="aaaaaaa"    /><TextView     android:id="@+id/body"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="bbbbbbbbb"    android:textSize="14sp"    android:layout_marginTop="5dp"    /></LinearLayout>

第三个是footerview,就是当前页面最底部的那个加载更多的按钮,

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/bt"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="点击加载更多" />    <ProgressBar        android:id="@+id/bar"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal"        android:visibility="gone" /></LinearLayout>


下面来看第一个News类

public class News {private String title;private String body;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}}
非常的简单,自动生成的方法

第二个MyAdapter适配器的类

public class MyAdapter extends BaseAdapter{private Context ctx;private List<News> list;public MyAdapter(Context ctx,List<News> list) {this.list=list;this.ctx=ctx;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder hodler;if (convertView==null) {hodler=new ViewHolder();convertView=View.inflate(ctx, R.layout.adapter,null);hodler.title = (TextView) convertView.findViewById(R.id.title);hodler.body = (TextView) convertView.findViewById(R.id.body);convertView.setTag(hodler);}else {hodler=(ViewHolder) convertView.getTag();}hodler.title.setText(list.get(position).getTitle());hodler.body.setText(list.get(position).getBody());return convertView;}public static class ViewHolder{private TextView title,body;}}

最后一个就是Mainactivity了

public class MainActivity extends Activity implements OnScrollListener, OnClickListener {private List<News> list;    private ListView lv;    private View footerView;//底部的视图    private int maxNum=50;//模拟数据的最大值    private int lastVisible;//当前界面最后可见的条目private Button bt;private ProgressBar bar;    private MyAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        list=new ArrayList<News>();        lv = (ListView) findViewById(R.id.lv);        footerView=View.inflate(this,R.layout.footerview,null);        lv.addFooterView(footerView);//将底部视图添加到listviewbt = (Button) footerView.findViewById(R.id.bt);bar = (ProgressBar) footerView.findViewById(R.id.bar);        initList();//初始化数据源        adapter = new MyAdapter(this, list);        lv.setAdapter(adapter);        bt.setOnClickListener(this);        lv.setOnScrollListener(this);    }Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {super.handleMessage(msg);if (msg.what==0) {bar.setVisibility(View.GONE);bt.setVisibility(View.GONE);//调用加载更多的方法,刷新适配器loadMore();adapter.notifyDataSetChanged();}};};private void initList() {for (int i = 0; i < 10; i++) {News news = new News();news.setTitle("第"+(i+1)+"条数据");news.setBody("第"+(i+1)+"条数据");list.add(news);}}//每次增加多少的方法private void loadMore(){int count = adapter.getCount();//获得当前总共有多少条目if ((count+10)<maxNum) {for (int i = count; i < count+10; i++) {News nees = new News();nees.setTitle("第"+(i+1)+"条数据");nees.setBody("第"+(i+1)+"条数据");list.add(nees);}}else {//剩余条目不足10条时for(int i=count;i<maxNum;i++){News nees1=new News();nees1.setTitle("第"+(i+1)+"条数据");nees1.setBody("第"+(i+1)+"条数据");list.add(nees1);}}}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (scrollState==SCROLL_STATE_IDLE&&lastVisible==adapter.getCount()) {bar.setVisibility(View.VISIBLE);bt.setVisibility(View.GONE);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry{Thread.sleep(3000);mHandler.sendEmptyMessage(0);}catch(Exception e){e.printStackTrace();}}}).start();}}/* * firstVisibleItem:当前界面显示的第一条item的下标,未完全显示也算 * visibleItemCount:当前界面内显示的item条数(未完全显示的也算) * totalItemCount:整个ListView全部的item的条目数 * */@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {lastVisible=firstVisibleItem+visibleItemCount-1;if (totalItemCount==maxNum+1) {lv.removeFooterView(footerView);Toast.makeText(this,"数据加载完成,无法更新",0).show();}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbt.setVisibility(View.GONE);bar.setVisibility(View.VISIBLE);new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {Thread.sleep(3000);//子线程延迟发送一条空消息mHandler.sendEmptyMessage(0);} catch (Exception e) {e.printStackTrace();}}}).start();}}

这样就完成了一个简单的listview的分页加载,用的是虚拟数据




0 0
原创粉丝点击