Android_ListView上拉加载更多(ListView分页功能)

先上效果图

加载完数据

首先定义一个底部正在加载的布局footer_layout.xml

<?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/load_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal"
        android:paddingBottom="10dip"
        android:paddingTop="10dip" >

        <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:textSize="16sp"
            android:textColor="@color/red"
            android:textStyle="bold"
            android:text="正在加载..." />
    </LinearLayout>
</LinearLayout>

自定义ListView---------LoadListView.java

package com.zwb.listviewloaddata.view;

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

import com.zwb.listviewloaddata.R;

/**
 * 类描述:自定义的ListView
 * 作者:zwb
 * 时间:16-5-9 11:21
 * 邮箱:@163.com
 */
public class LoadListView extends ListView implements AbsListView.OnScrollListener {

    View footer;// 底部布局;
    int totalItemCount;// 总数量;
    int lastVisibleItem;// 最后一个可见的item;
    boolean isLoading;// 正在加载;
    ILoadListener iLoadListener;
    public LoadListView(Context context) {
        super(context);
        initView(context);
    }

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

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

    /**
     * 添加底部加载提示布局到listview
     *
     * @param context
     */
    private void initView(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        footer = inflater.inflate(R.layout.footer_layout, null);
        footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
        this.addFooterView(footer);
        this.setOnScrollListener(this);
    }

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

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub
        if (totalItemCount == lastVisibleItem
                && scrollState == SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading = true;
                footer.findViewById(R.id.load_layout).setVisibility(
                        View.VISIBLE);
                // 加载更多
                iLoadListener.onLoad();
            }
        }
    }
    /**
     * 加载完毕
     */
    public void loadComplete(){
        isLoading = false;
        footer.findViewById(R.id.load_layout).setVisibility(
                View.GONE);
    }

    public void setInterface(ILoadListener iLoadListener){
        this.iLoadListener = iLoadListener;
    }
    //加载更多数据的回调接口
    public interface ILoadListener{
        public void onLoad();
    }
}

在布局文件中引用自定义的ListView

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:background="@color/white"
    android:layout_height="match_parent"
    tools:context="com.zwb.listviewloaddata.MainActivity">

    <com.zwb.listviewloaddata.view.LoadListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:cacheColorHint="#00000000"
        android:dividerHeight="5dip"
        />
</RelativeLayout>

ListView的item资源文件:

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_centerInParent="true"
    android:background="@color/white"
    card_view:cardCornerRadius="8dp">

    <LinearLayout
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:background="@color/white"
        android:layout_width="match_parent"
        android:layout_height="60dp">

        <ImageView
            android:id="@+id/item_img"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@mipmap/ic_launcher"
            android:layout_marginLeft="10dp"/>

        <LinearLayout

            android:layout_marginLeft="10dp"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/item_name"
                android:text="我是标题"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <TextView
                android:id="@+id/item_msg"
                android:text="今天天气还可以啊"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </LinearLayout>

    </LinearLayout>
</android.support.v7.widget.CardView>

 接下来就是在Activity中初始化数据和对ListView设置数据

MainActivity.java

package com.zwb.listviewloaddata;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import com.zwb.listviewloaddata.adapter.ItemAdapter;
import com.zwb.listviewloaddata.entity.ItemEntity;
import com.zwb.listviewloaddata.view.LoadListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements LoadListView.ILoadListener{

    private ArrayList<ItemEntity> list = new ArrayList<>();
    private LoadListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化数据的方法
        getData();
        showListView(list);
    }

    private ItemAdapter adapter;

    private void showListView(ArrayList<ItemEntity> list) {
        if (adapter == null){
            listView = ((LoadListView) findViewById(R.id.listView));
            listView.setInterface(this);
            adapter = new ItemAdapter(getApplicationContext() ,list);
            listView.setAdapter(adapter);
        }else {
            adapter.onDateChange(list);
        }
    }

    private void getMoreData() {
        for (int i = 0; i < 3; i++) {
            ItemEntity entity = new ItemEntity();
            entity.setName("新的测试标题");
            entity.setMsg("我是一条新的测试的内容啊~");
            list.add(entity);
        }
    }

    private void getData() {
        for (int i = 0; i < 10; i++) {
            ItemEntity entity = new ItemEntity();
            entity.setName("测试标题");
            entity.setMsg("我是一条测试的内容啊~");
            list.add(entity);
        }
    }

    @Override
    public void onLoad() {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {

                //加载数据
                getMoreData();

                //更新ListView的显示
                showListView(list);

                //ListView加载完毕
                listView.loadComplete();

            }
        } , 2000);
    }

}

ListView的Adapter

ItemAdapter.java

package com.zwb.listviewloaddata.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.zwb.listviewloaddata.R;
import com.zwb.listviewloaddata.entity.ItemEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * 类描述:ListView的Adapter
 * 作者:zwb
 * 时间:16-5-9 11:06
 * 邮箱:@163.com
 */
public class ItemAdapter extends BaseAdapter{

    private Context context;
    private ArrayList<ItemEntity> list;

    public ItemAdapter(Context context, ArrayList<ItemEntity> list) {
        this.context = context;
        this.list = list;
    }
    public void onDateChange(ArrayList<ItemEntity> list) {
        this.list = list;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ItemEntity entity = list.get(position);
        ViewHolder holder;
        if (convertView == null){
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.item_layout , parent ,false);
            holder.name = ((TextView) convertView.findViewById(R.id.item_name));
            holder.msg = ((TextView) convertView.findViewById(R.id.item_msg));
            convertView.setTag(holder);
        }else {
            holder = ((ViewHolder) convertView.getTag());
        }
        holder.name.setText(entity.getName());
        holder.msg.setText(entity.getMsg());

        return convertView;
    }

    class ViewHolder{
        TextView name;
        TextView msg;
    }
}

ok大功告成。

下载链接

Android_ListView分页

时间: 2024-10-18 09:20:57

Android_ListView上拉加载更多(ListView分页功能)的相关文章

Android上拉加载更多ListView——PulmListView

思路 今天带大家实现一个上拉加载更多的ListView.GitHub传送门:PulmListView, 欢迎大家fork&&star. 先带大家理一下思路, 如果我们要实现一个上拉加载更多的ListView, 我们需要实现的功能包括: 一个自定义的ListView, 并且该ListView能够判断当前是否已经处于最底部. 一个自定义的FooterView, 用于在ListView加载更多的过程中进行UI展示. 关联FooterView和ListView, 包括加载时机判断.FooterVi

下拉刷新,上拉加载更多ListView

点击这里下载源码     点击这里查看更多 这里是重写ListView实现下拉刷新下拉加载的源码: public class DropDownListView extends ListView implements OnScrollListener { private boolean isDropDownStyle = true; private boolean isOnBottomStyle = true; private boolean isAutoLoadOnBottom = false;

Android中ListView上拉加载更多及下拉刷新

做几乎每一个Android应用开发,都少不了用到一个控件,那就是ListView,用于加载多条数据,并用一定的样式展示出来.但是为了性能问题(一次性加载太多数据,比如100000条,耗费时间长,消耗资源多等)及用户体验问题(比如用户只想看最新的10条数据,结果一下子把所有的上万条数据都加载了,不方便用户选择)等原因,所以我们要把ListView的数据进行分页加载,常用的就是ListView的上拉加载更多及下拉刷新最新数据. 我们可以自己封装一个带上下拉功能的ListView,通常就是加上头部He

移动端touch事件 || 上拉加载更多

前言: 说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉 实现加载更多的插件.然后就留下了个坑:上拉加载的时候会由于用户错误的姿势,例如长按后再touchmove等会出现卡死的假象.(ps:当然, 我不认为是插件的问题,当时的想法是觉得引用的插件存在冲突),于是,我就直接通过封装touch事件完成上拉加载实现分页的功能. 备注:文章最后会加上为实现这个功能我找的一些插件 了解touch事件 在应用touch事件实现上拉加

小程序_上拉加载更多

小程序有两种上拉加载更多的分页效果. 第一种利用onReachBottom函数 1 onReachBottom: function() { 2 3 // Do something when page reach bottom. 4 5 } 第二种使用scroll-view标签,这个标签需要给定一定的高度才能实现,同时还需要设置scroll-y为true,再在bindscrolltolower滚动到底部触发事件. 代码: wxml <!-- 主容器 --> <view> <sc

react-native ListView 封装 实现 下拉刷新/上拉加载更多

1.PageListView 组件封装 src/components/PageListView/index.js /** * 上拉刷新/下拉加载更多 组件 */ import React, { Component } from 'react'; import { Text, View, ListView, FlatList, Dimensions, PanResponder, Animated, Easing, ActivityIndicator, } from 'react-native';

android 安卓 listview 支持下拉刷新 上拉加载更多

[1]重写listView import java.text.SimpleDateFormat; import java.util.Date; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGrou

android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)

Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableListView,GridView,WebView等. 下载地址:https://github.com/chrisbanes/Android-PullToRefresh 首先第一步当然是导入libriay到咱们的项目了,具体导入方式,这里不再赘述. 下面是个例子采用的是ListView,当然其余的和这

Android中自定义ListView实现上拉加载更多和下拉刷新

ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,GitHub上有一些开源库可以使用,但是本着学习的精神,我做的是使用自定义ListView实现这个功能. 思路:谷歌提供的ListView是不能提供下拉刷新和下拉加载的,所以我们就需要重写ListView.在ListView的头部和尾部加上我们的布局文件(progressbar). 先说上拉加载更多实现