滚动到顶部自动加载数据的listview封装

本文介绍了一个自定义的AutoLoadMoreListView组件,用于在ListView中实现分页加载数据的功能。通过设置加载完成监听器,实现了数据加载的控制与响应,确保了用户体验的流畅性和数据的高效加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AutoLoadMoreListView

package com.example.niehongtao.listviewdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;

/**
 * Created by niehongtao on 16/4/18.
 */
public class AutoLoadMoreListView extends ListView {
    // 这个布尔变量是必须使用的,因为不然会访问多次网络,这个可以控制,防止访问多次网络
    private boolean mIsLoading = false;
    private OnLoadMoreListener mOnLoadMoreListener;
    private View mHeaderView;

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

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

    private void init(Context context) {
        mHeaderView = View.inflate(context, R.layout.autoloadmorelistview_header, null);
        super.addHeaderView(mHeaderView);
        hideHeadView();
        super.setOnScrollListener(mScrollListener);
    }

    private void hideHeadView() {
        mIsLoading = false;
        mHeaderView.setVisibility(View.GONE);
    }

    private void showHeadView() {
        mIsLoading = true;
        mHeaderView.setVisibility(View.VISIBLE);
    }

    /**
     * 加载完数据,供外界调用
     */
    public void onLoadMoreComplete() {
        mIsLoading = false;
        hideHeadView();
    }


    private OnScrollListener mScrollListener = new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
//            if (scrollState == SCROLL_STATE_FLING || scrollState == SCROLL_STATE_TOUCH_SCROLL || scrollState == SCROLL_STATE_IDLE) {
//                // 是否到了第一个条目
//                if (view.getFirstVisiblePosition() == 0 && !mIsLoading && mOnLoadMoreListener != null) {
//                    showHeadView();
//                    mOnLoadMoreListener.onLoadMore();
//                }
//            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem == 0 && !mIsLoading && mOnLoadMoreListener != null) {
                showHeadView();
                mOnLoadMoreListener.onLoadMore();
            }
        }
    };


    /**
     * 加载更多数据的接口
     */
    interface OnLoadMoreListener {
        void onLoadMore();
    }

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        mOnLoadMoreListener = onLoadMoreListener;
    }

}

autoloadmorelistview_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/loading"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center"
    >

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

MyAdapter

class MyAdapter extends BaseAdapter {
    private List<String> contents;
    private Context mContext;

    public MyAdapter(List<String> contents, Context context) {
        this.contents = contents;
        mContext = context;
    }

    @Override
    public int getCount() {
        return contents.size();
    }
    @Override
    public Object getItem(int position) {
        return contents.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false);
            holder = new ViewHolder();
            holder.tvContent = (TextView) convertView.findViewById(R.id.tvContent);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tvContent.setText(contents.get(position));
        return convertView;
    }
    class ViewHolder{
        TextView tvContent;
    }
}

MainActivity

public class MainActivity extends Activity {
    private AutoLoadMoreListView listview;
    private MyAdapter adapter;
    private List<String>  contents;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        listview = (AutoLoadMoreListView) findViewById(R.id.listview);
        adapter = new MyAdapter(contents, this);
        listview.setAdapter(adapter);
        listview.setOnLoadMoreListener(new AutoLoadMoreListView.OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        load();
                        adapter.notifyDataSetChanged();
                        listview.setAdapter(adapter);
                        listview.setSelection(20);
                        listview.onLoadMoreComplete();
                    }
                }, 1000);
            }
        });
    }


    protected void load() {
        ArrayList<String> list = new ArrayList<>();
        for(int i = 0; i < 20; i++) {  //每次加载20条数据
            list.add("加载数据:::" + i);
        }
        contents.addAll(0, list);
    }
    private void initData() {
        contents = new ArrayList<String>();
        for(int i = 0; i < 20; i++){
            contents.add("加载数据:::" + i);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值