自定义LoadMoreListView

自定义loadmoreListView 完成对数据的下滑加载,和 加载状态的显示的处理

模板代码

package xiaoxu.com.lifeservice.ui.loadmore;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.AbsListView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.List;

import xiaoxu.com.lifeservice.R;
import xiaoxu.com.lifeservice.http.HttpClient;

/**
 * Created by Administrator on 2016/5/4.
 * 用法:和普通的listView一样,在xml文件中指定,不过这里应该指定为 LoadMoreListView
 * 提供了setmOnLoadMoreListener()公有的方法,接口回调机制,完成加载动作。
 * 注意:这里的 HttpClient.PAGE_SIZE 是指该listView应该默认为加载多少条item的数量.
 *
 */
public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {

    Boolean mIsLoadingMore = false;
    Boolean mLastItemVisible;
    OnScrollListener mOnScrollListener;
    public OnLoadMoreListener mOnLoadMoreListener;
    RelativeLayout mFooterView;
    ProgressBar mProgressBar;
    TextView mTextView;

    public void setmOnScrollListener(OnScrollListener mOnScrollListener) {
        this.mOnScrollListener = mOnScrollListener;
    }


    public LoadMoreListView(Context context) {
        super(context);
        init();
    }

    public LoadMoreListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadMoreListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public LoadMoreListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init() {

        mFooterView = (RelativeLayout) LayoutInflater.from(getContext()).inflate(R.layout.layout_load_more, null, false);
        mProgressBar = (ProgressBar) mFooterView.findViewById(R.id.progress_bar);
        mTextView = (TextView) mFooterView.findViewById(R.id.text);

        removeFooterView(mFooterView);
        setFooterDividersEnabled(false);
        addFooterView(mFooterView);
        super.setOnScrollListener(this);
    }

    @Override
    public void setAdapter(ListAdapter adapter) {
        super.setAdapter(adapter);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

        if (!mIsLoadingMore && scrollState == OnScrollListener.SCROLL_STATE_IDLE && mLastItemVisible) {
            mIsLoadingMore = true;
            onLoadMore(); //加载一次数据  接口回调
        }
        if( mOnScrollListener != null ) {

            mOnScrollListener.onScrollStateChanged(view,scrollState);
        }
    }

    public void setmOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) {
        this.mOnLoadMoreListener = mOnLoadMoreListener;
    }

    private void onLoadMore() {
        if(mIsLoadingMore != null) {

            mOnLoadMoreListener.onLoadMore();
        }

    }

    /**
     * Set whether the Last Item is Visible. lastVisibleItemIndex is a
     * zero-based index, so we minus one totalItemCount to check
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        if (null != mOnLoadMoreListener) {
            mLastItemVisible = (totalItemCount > 0) && (firstVisibleItem + visibleItemCount >= totalItemCount - 1);
        }

        // Finally call OnScrollListener if we have one
        if (mOnScrollListener != null) {

            mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
        }

    }

    public void updateLoadMoreViewText (List data) {

        if(getAdapter().getCount() == 0 || data.isEmpty()) {

            setLoadMoreViewTextNoData();
        } else if (data.size() < HttpClient.PAGE_SIZE) {
            //每一页要加载的item的数量,当最后一次加载的数据小于这个值后,设置以加载全部。
            setLoadMoreViewTextNoMoreData();

        }

        mIsLoadingMore = false;
    }


    public void onLoadMoreComplete(){

        mIsLoadingMore = false;
    }

    public void setLoadMoreViewTextError() {
        mTextView.setText("网络异常,加载重试");
        mProgressBar.setVisibility(GONE);
        mIsLoadingMore = false;
    }

    public void setLoadMoreViewTextNoData() {
        mTextView.setText("暂无数据");
        mProgressBar.setVisibility(GONE);
        mIsLoadingMore = false;
    }

    public void setLoadMoreViewTextNoMoreData() {
        mTextView.setText("已加载全部");
        mProgressBar.setVisibility(GONE);
        mIsLoadingMore = false;
    }

    public void setLoadMoreViewText(String text) {
        mTextView.setText(text);
        mProgressBar.setVisibility(VISIBLE);
    }

    public void setLoadMoreViewText(int resId) {
        mTextView.setText(resId);
        mProgressBar.setVisibility(VISIBLE);
    }

    public interface OnLoadMoreListener {
       void onLoadMore();
    }

}
  • 以下是该模板代码用到的xml文件
<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:clickable="false"
    android:gravity="center">

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_gravity="center"
        android:layout_marginRight="10dp"
        android:indeterminate="false"/>
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:layout_centerInParent="true"
        android:layout_toRightOf="@id/progress_bar"
        android:text="正在载入...."
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceSmall"/>

</RelativeLayout>

使用Demo

private void loadData() {
        if (isLoadAll) {

            return;
        }
        searchParam.setPno(pno);//SearchParam封装的请求信息参数的类  如经纬度、城市...
        HttpClient.getRecommendShops(searchParam, new   HttpResponseHandle() {
//静态方法回调
            @Override
            public void onSuccess(String content) {

                mPtrFrame.refreshComplete();
                JSONObject object = JSON.parseObject(content);
                List<SearchShop> list = JSONArray.parseArray(object.getString("body"), SearchShop.class);

                for(SearchShop s : list) {

                    Log.v("TextFrag", "  name " + s.getName() + "\n");
                }
                Log.v("TextFrag","------");
                listView.updateLoadMoreViewText(list);

                isLoadAll = list.size() < HttpClient.PAGE_SIZE;

                Log.v("TextFrag","  listSize " + list.size());

                if (pno == 1) {
                    quickAdapter.clear();
                }
                quickAdapter.addAll(list);
                pno++;
            }

            @Override
            public void onFailure(Request request, IOException e) {
                mPtrFrame.refreshComplete();
            }
        });
    }

        listView.setmOnLoadMoreListener(new LoadMoreListView.OnLoadMoreListener() {
            @Override
            public void onLoadMore() {

                Log.v("TextFrag","加载更多");

                loadData();

            }
        });


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

              //UiHelper.showHouseDetailActivity(mActivity);
            }
        });
  • 总结: 这样就完成了 向下滑动listView,执行加载操作。根据加载的状况listview 底部显示提醒信息。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值