下拉刷新--加载更多

这是程序实现的效果
如下

现在来分析是如何做到的
先来配置footermore的布局文件

<?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" >

    <LinearLayout
        android:id="@+id/footer_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:orientation="horizontal" 
        >

        <ProgressBar
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="正在加载,请稍等。。。" />
    </LinearLayout>

</LinearLayout>

很简单就是一个progressbar和一个textview
然后新建一个LoadListView来将其加载。

public class LoadListView extends ListView implements OnScrollListener {
    private View footer;// 底部布局
    int totalItemCount;// 总数量
    int lastVisibieItem;// 最后一个可见的item;
    boolean isLoading;// 判断变量
    IloadListener iLoadListener;// 接口变量

    public LoadListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public LoadListView(Context context) {
        super(context);
        initView(context);
    }

    public LoadListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
        // TODO Auto-generated constructor stub
    }

    // listview加载底部布局
    private void initView(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        footer = inflater.inflate(R.layout.footermore, null);
        // 设置隐藏底部布局
        footer.findViewById(R.id.footer_layout).setVisibility(View.GONE);
        this.addFooterView(footer);
        this.setOnScrollListener(this);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub
        if (totalItemCount == lastVisibieItem && scrollState == SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading = true;
                footer.findViewById(R.id.footer_layout).setVisibility(View.VISIBLE);
                // 加载更多(获取接口)
                iLoadListener.onLoad();
            }
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        this.lastVisibieItem = firstVisibleItem + visibleItemCount;
        this.totalItemCount = totalItemCount;
    }

    public void setInterface(IloadListener iLoadListener) {

        this.iLoadListener = iLoadListener;
    }

    // 加载更多数据的回调接口
    public interface IloadListener {
        public void onLoad();
    }

    // 加载完成通知隐藏
    public void loadComplete() {
        isLoading = false;
        footer.findViewById(R.id.footer_layout).setVisibility(View.GONE);

    }
}

此段代码先重写了Listview的3个构造方法,然后用一个initview()方法来加载底部布局用布局构造器LayoutInflater类来实现,然后调用listview的addFooterView方法。开始时先将底部布局设置为隐藏,再在下拉时间中将其显示出来。我们来看代码 重写了listview的onScrollListener方法,监听事件里面有两个值得注意的方法

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub
        if (totalItemCount == lastVisibieItem && scrollState == SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading = true;
                footer.findViewById(R.id.footer_layout).setVisibility(View.VISIBLE);
                // 加载更多(获取接口)
                iLoadListener.onLoad();
            }
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        this.lastVisibieItem = firstVisibleItem + visibleItemCount;
        this.totalItemCount = totalItemCount;
    }

先看onScroll()方法带有四个参数 根据名称很好看出参数的含义 view ,开始项,可见项的个数,总个数。我们定义一个lastVisibieItem = firstVisibleItem + visibleItemCount;等于开始项加可见项个数。来判断下拉是否到底了。if (totalItemCount == lastVisibieItem && scrollState == SCROLL_STATE_IDLE)当到底了,且停止滚动了。就加载底部布局。
因为改变ui不能再子线程中完成 所以我们,调用一个接口IloadListener 并在主线程中实现其的onLoad方法来加载底部布局。

listview类

public class ListviewItem {
    private String name;
    private int imageid;

    public ListviewItem(String name, int imageid) {
        super();
        this.name = name;
        this.imageid = imageid;
    }

    public String getName() {
        return name;
    }

    public int getImageid() {
        return imageid;
    }

}

在ListViewTest中实现

public class ListViewTest extends Activity implements IloadListener {
    private LoadListView listview;
    private List<ListviewItem> listviewitems = new ArrayList<ListviewItem>();
    private ItemAdapter adapter;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listviewtest);
        listview = (LoadListView) findViewById(R.id.listview);
        adapter = new ItemAdapter(this, R.layout.listview_items, listviewitems);
        listview.setAdapter(adapter);// 加载适配器
        listview.setInterface(this);//将接口传进来
        initItems();// 初始化数据

    }

    private void initItems() {
        // TODO Auto-generated method stub
        for(int i=0;i<15;i++){
            ListviewItem listviewitem1 = new ListviewItem("初始化的"+i, R.drawable.ic_launcher);
            listviewitems.add(listviewitem1);
        }
    }

    // 获取更多数据 通知listview显示
    @Override
    public void onLoad() {
        // 刷新太快 所以新启一个线程延迟两秒
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i < 3; i++) {
                    ListviewItem listviewitem1 = new ListviewItem("加载的" + count, R.drawable.ic_launcher);
                    listviewitems.add(listviewitem1);
                    count++;

                } // 通知listview加载完毕
            listview.loadComplete();
            }
        }, 2000);
        // TODO Auto-generated method stub

    }

}

还有主布局listviewtest.xml

<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.example.demotest.MainActivity" >

    <com.example.demotest.LoadListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.example.demotest.LoadListView>

</LinearLayout>
posted @ 2016-04-20 14:35  Tesi1a  阅读(128)  评论(0编辑  收藏  举报