Android的ListView简单的自定义上拉加载

来源:互联网 发布:淘宝联盟的意思 编辑:程序博客网 时间:2024/04/29 20:49

啥都不多说,直接上代码,自己看注释
MainActivity的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <ListView        android:id="@+id/listView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"         android:cacheColorHint="#00000000"         /></RelativeLayout>

加载中(loading)的那个布局

<?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="wrap_content"    android:orientation="horizontal"    android:paddingBottom="20dip"    android:paddingTop="20dip"    android:visibility="gone">    <ProgressBar        android:id="@+id/progressBar2"        style="?android:attr/progressBarStyleSmall"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_vertical" />    <TextView        android:id="@+id/loadmore_text"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="数据加载中..."        android:textSize="18dip" /></LinearLayout>

这是主要的逻辑代码

package com.xzw.demo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;public class MainActivity extends Activity implements OnScrollListener {    private static final String TAG = "MainActivity";    private ListView listView;    private View moreView; //加载更多页面    private SimpleAdapter adapter;    private ArrayList<HashMap<String, String>> listData;    private int lastItem;    private int count;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView)findViewById(R.id.listView);        moreView = getLayoutInflater().inflate(R.layout.load, null);        listData = new ArrayList<HashMap<String,String>>();        //准备数据,先给list添加假数据        prepareData();         count = listData.size();        adapter = new SimpleAdapter(this, listData,R.layout.item,                new String[]{"itemText"}, new int[]{R.id.itemText});        //添加底部view,一定要在setAdapter之前添加,否则会报错。        listView.addFooterView(moreView);        listView.setAdapter(adapter); //设置adapter        //设置listview的滑动事件监听,如果在Fragment等非Activity中可以直接new出来        listView.setOnScrollListener(this);    }    //添加假数据    private void prepareData(){          for(int i=0;i<10;i++){            HashMap<String, String> map = new HashMap<String, String>();            map.put("itemText", "测试数据"+i);            listData.add(map);        }    }    /**     * 加载更多的数据,count是用设置每次加载开始的位置,每次加载5条     */    private void loadMoreData(){         count = adapter.getCount();        for(int i=count;i<count+5;i++){            HashMap<String, String> map = new HashMap<String, String>();            map.put("itemText", "测试数据"+i);            listData.add(map);        }        count = listData.size();    }    @Override    public void onScroll(AbsListView view, int firstVisibleItem,                         int visibleItemCount, int totalItemCount) {        Log.i(TAG, "firstVisibleItem="+firstVisibleItem+"\nvisibleItemCount="+                visibleItemCount+"\ntotalItemCount"+totalItemCount);        lastItem = firstVisibleItem + visibleItemCount - 1;  //减1是因为上面加了个addFooterView    }    @Override    public void onScrollStateChanged(AbsListView view, int scrollState) {        Log.i(TAG, "scrollState="+scrollState);        //下拉到空闲是,且最后一个item的数等于数据的总数时,进行更新        if(lastItem == count  && scrollState == this.SCROLL_STATE_IDLE){            Log.i(TAG, "拉到最底部");            moreView.setVisibility(view.VISIBLE);            mHandler.sendEmptyMessage(0);        }    }    //声明Handler,由于是假数据,上拉时先睡几秒    private Handler mHandler = new Handler(){        public void handleMessage(android.os.Message msg) {            switch (msg.what) {                case 0:                    try {                        Thread.sleep(3000);                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                    loadMoreData();  //加载更多数据,这里可以使用异步加载                    adapter.notifyDataSetChanged();                    moreView.setVisibility(View.GONE);                    if(count >=listData.size() ){                        Toast.makeText(MainActivity.this, "木有更多数据!", 3000).show();                        listView.removeFooterView(moreView); //移除底部视图                    }                    Log.i(TAG, "加载更多数据");                    break;                case 1:                    break;                default:                    break;            }        };    };}
0 0
原创粉丝点击