zoukankan      html  css  js  c++  java
  • Android的ListView分页功能

    一、功能分析----ListView“加载更多”,功能如下图所示:

    image image

    这个效果是当你上拉拖动页面时(注意有区别于下拉刷新),页面提示正在加载,2秒后显示留言更多内容;具体功能知道那我就来讲解下如何实现这个功能。

    二、创建自定义ListView及其底部布局footer

    首先做一个加载提示布局,布局footer_layout如下图

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/load_layout"
        android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_gravity="center" >
            <ProgressBar
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               style="?android:attr/progressBarStyleSmall"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="正在加载..." />
    </LinearLayout>

    将布局添加至ListView,自定义一个ListView

    package com.mg.message.view;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.AbsListView;
    import android.widget.AbsListView.OnScrollListener;
    import android.widget.ListView;
    import com.mg.message.R;

    public class LX_LoadListView extends ListView implements OnScrollListener{
        View footer;//底部布局
        int totalItemCount;//总数量
        int lastVisibleItem;//最后一个可见的Item
        boolean isLoading;//正在加载
        ILoadListener iLoadListener;
        public LX_LoadListView(Context context) {
            super(context);
            initView(context);
        }
       
        public LX_LoadListView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView(context);
        }
       
        public LX_LoadListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            initView(context);
        }
    /**
    * 添加底部加载提示布局到listview
    * @param context
    */
        private void initView(Context context) {
            LayoutInflater layoutInflater=LayoutInflater.from(context);
            footer=layoutInflater.inflate(R.layout.lx_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)
        {
            this.lastVisibleItem=firstVisibleItem+visibleItemCount;
            this.totalItemCount=totalItemCount;
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            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设置Adapter并实现接口中的Load方法

    ①自定义ListView布局,lx_get_content_activity

    <?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"
        android:layout_marginTop="2dp"
        android:layout_marginBottom="2dp"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="2dp"
        android:background="@drawable/edit_normal">
        <com.mg.message.view.LX_LoadListView
            android:id="@+id/list_content"
            android:layout_width="match_parent"
            android:background="@drawable/edit_normal"
            android:layout_height="0dip"
            android:focusable="true"
            android:layout_weight="1.20" >
        </com.mg.message.view.LX_LoadListView>
    </LinearLayout>

    ②给ListView设置Adapter,并实现接口的Load方法

    package com.mg.message.ui;

    import java.util.ArrayList;
    import java.util.List;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemLongClickListener;
    import android.widget.AdapterView.OnItemClickListener;
    import com.mg.core.base.BaseActivity;
    import com.mg.core.net.OperateCode;
    import com.mg.core.net.ThreadMessage;
    import com.mg.message.R;
    import com.mg.message.data.GetMessageData;
    import com.mg.message.domain.Message;
    import com.mg.message.ui.adapter.ContentAdapter;
    import com.mg.message.utils.ViewUtil;
    import com.mg.message.view.LX_LoadListView;
    import com.mg.message.view.LX_LoadListView.ILoadListener;
    /* * 获得留言*/
    public class LX_GetContentActivity extends BaseActivity implements ILoadListener
    {
        private LX_LoadListView listView;
        private List<Message> totalMessages=new ArrayList<Message>();
        private static ContentAdapter myAdapter;
        private int totalSize;
        List<Message> messages=new ArrayList<Message>();
        @Override
        protected void initEvents()
        {
            listView.setOnItemClickListener(new OnItemClickListener() //进入删除页
            {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                        long arg3)
                {
                    Bundle bundle = new Bundle(); //传递多参数时使用Bundle
                    bundle.putString("ID", messages.get(position).getID());
                    bundle.putString("UContent", messages.get(position).getContent().toString());
                    bundle.putString("UTime", messages.get(position).getCreateTime());
                       startCOActivity(LX_DeleteActivity.class,bundle);
                       finish();
                }
            });
            //修改留言
            listView.setOnItemLongClickListener(new OnItemLongClickListener()
            {
                @Override
                public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                        int position, long arg3) {
                    Bundle bundle = new Bundle(); //传递多参数时使用Bundle
                    bundle.putString("ID", messages.get(position).getID());
                       startCOActivity(LX_AddMessageActivity.class,bundle);
                       finish();
                    return false;
                }
            });
        }

        @Override
        protected void initViews()
        {
            setContentView(R.layout.lx_get_content_activity);
            mTopBar.setVisibility(View.VISIBLE);
            mTopBar.SetTvName("查看留言");
            listView=(LX_LoadListView)findViewById(R.id.list_content);
            listView.setInterface(this);
              myAdapter=new ContentAdapter(messages);
              listView.setAdapter(myAdapter);

        }
        @Override
        protected void onResume() {
            super.onResume();
            showToast("onResume", false);
            sendToBackgroud(OperateCode.i_getMessageInfo);
        }
        @Override
        protected void receiveRequest(ThreadMessage threadMessage)
        {
            hideProgressDialog();
            OperateCode operateCode = threadMessage.getOperateCode();
            List<Message> messageList;
            switch (operateCode)
            {  //查看留言
                case i_getMessageInfo:
                    messageList=GetMessageData.getMessagesList();
                    if(ViewUtil.isNotEmpty(messageList))
                    {
                        totalMessages.clear();
                        messages.clear();
                        totalMessages.addAll(messageList);
                        totalSize=totalMessages.size();
                        getData();
                        myAdapter.notifyDataSetChanged();
                    }
                    break;
                default:
                    break;
            }
        }
        //listview初始化条数
        private void  getData()
        {
            try {
                if (totalSize<9) {
                    messages.addAll(GetMessageData.getMessagesList());
                    showToast("留言小于9加载完毕", false);
                }
                else {
                    messages.addAll(GetMessageData.getMessagesList().subList(0, 8));
                }
            }
            catch (Exception e) {
            }
        }
        //加载数据
        private void getLoadData()
        {
            int lastsize=totalSize-messages.size();
            if(messages.size()<totalSize)
            {
                if (lastsize<5) {
                    messages.clear();
                    messages.addAll(GetMessageData.getMessagesList());
                    showToast("加载项<5加载完毕", false);
                }
                else {
                    messages.addAll(totalMessages.subList(messages.size(), messages.size()+5));
                }
            }       
            else
            {
                messages.clear();
                messages.addAll(GetMessageData.getMessagesList());
                showToast("全部加载完毕", false);
            }
            myAdapter.notifyDataSetChanged();
        }
        @Override
        public void onLoad()
        {
            android.os.Handler handler=new android.os.Handler();
            handler.postDelayed(new Runnable()
            {
                @Override
                public void run() {
                    getLoadData();//获取更多数据
                    listView.loadComplete();//通知listview加载完毕
                }
            }, 2000);
        }
    }

  • 相关阅读:
    Android TabHost(选项卡)
    监控工具之---Prometheus查询持久性(六)
    监控工具之---Prometheus表达式promQL生产中应用(五)
    Grafana Configuration 参数详解(1)
    监控工具之---Prometheus数据可视化Grafana(七)
    监控工具之---Prometheus 安装详解(三)
    监控工具之---Prometheus 配置exporter四)
    Kubernetes容器编排技术---kubectl命令行工具用法详解(三)
    Kubernetes容器编排技术---Kubernetes基于kubeadm安装与配置(二)
    Azure Iaas基础之---创建虚拟机
  • 原文地址:https://www.cnblogs.com/wucaiyun1/p/4733998.html
Copyright © 2011-2022 走看看