Android ListView分页,动态添加数据

1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载,

我们可以利用listView.addFootView(View v)方法进行提示

自定义一个ListView(这里本来想进行一些自定已修改的。。。实际代码并没有做)CornerListView

package com.example.testlistview;

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

public class CornerListView extends ListView{

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

    public CornerListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CornerListView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
}

包含ListView的配置文件 activity_main.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testlistview.MainActivity" >

   <com.example.testlistview.CornerListView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_margin="10dip"
       android:id="@+id/list"
       >
   </com.example.testlistview.CornerListView>

</RelativeLayout>

ListView每一项的Item配置文件  listview_item.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" >

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="1"
        android:gravity="center_horizontal"
        ></TextView>
</LinearLayout>

有更多数据时的配置文件more.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="match_parent" >
    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="更多"
        />
   <ProgressBar
       android:id="@+id/loading"
       style="@android:style/Widget.ProgressBar.Large"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:visibility="gone"
       />
</RelativeLayout>

CorernerListView对应的Adapter适配器 CornerAdapter.java

package com.example.testlistview;

import java.util.List;

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

public class CornerAdapter extends BaseAdapter{

    LayoutInflater inflater;
    public List<String> list;
    private Context context;

    public CornerAdapter(List<String> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @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) {
        ViewHolder viewHolder;
        if(convertView == null)
        {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.listview_item, null, false);
            TextView tv1= (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.tv = tv1;
            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.tv.setText(list.get(position));
        return convertView;
    }

    class ViewHolder{
        public TextView tv;
    }
}

主Activity代码:

package com.example.testlistview;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.TextView;

public class MainActivity extends Activity implements OnScrollListener{

    private int pageIndex = 1;
    private int pageSize = 2;
    private int pageCount = 2;//初始设置页数为2,因为刚开始不知道总页数
    private CornerListView listView;
    private CornerAdapter adapter;
    private View footer,tvMsg,loading;
    private boolean is_divPage = false;//是否分页
    private List<String> list = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (CornerListView) findViewById(R.id.list);
        listView.setOnScrollListener(this);
        footer = View.inflate(this, R.layout.more, null);
        tvMsg = footer.findViewById(R.id.tv_msg);
        loading = footer.findViewById(R.id.loading);
        listView.addFooterView(footer);//添加footerview
        Thread thread = new Thread(runnable);//第一次访问服务器接口,返回第一页信息,并确定总页数信息
        thread.start();
    }

    //异步访问网络加载数据之类的。。
    Runnable runnable = new Runnable() {

        @Override
        public void run() {
            //传递pageIndex,pageSize,URL等参数访问网络获取数据,这里省略。。。
            //doSomething
            String strJson = "";//假定strJson就是服务器返回的这一页Json数据
            //假设这里返回总页数为5
            pageCount = 5;
            Message msg = new Message();
            msg.obj = strJson;
            handler.sendMessage(msg);//将消息返回给UI

        }
    };

    //处理返回的消息,设置ListView
    Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            String strJson = msg.obj.toString();
            //各种转换组合数据,这里我们就不做了,模拟一下数据
            for(int i=0;i<pageSize; ++i)
            {
                if(adapter != null && adapter.list != null)//从获取第二页开始,直接修改适配器的list
                {
                    adapter.list.add(i+"");
                }
                else//第一次适配器还没有构造
                {
                    list.add(i+"");
                }
            }
            if(pageIndex == 1)//第一次,设置适配器
            {
                adapter = new CornerAdapter(list, MainActivity.this);
                listView.setAdapter(adapter);
                //判断一下是否显示更多按钮
                if(pageIndex == pageCount)
                {
                    listView.removeFooterView(footer);
                }
                else if(pageIndex < pageCount)
                {
                    //设置tvmsg显示,加载动画不显示
                    tvMsg.setVisibility(View.VISIBLE);
                    loading.setVisibility(View.GONE);
                }
            }
            else
            {
                //直接调用方法更新数据
                adapter.notifyDataSetChanged();
                if(pageIndex == pageCount)
                {
                    listView.removeFooterView(footer);
                }
                else if(pageIndex < pageCount)
                {
                    //设置tvmsg显示,加载动画不显示
                    tvMsg.setVisibility(View.VISIBLE);
                    loading.setVisibility(View.GONE);
                }
            }

        }

    };

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
            //需要分页,触摸停止,当前确实还有分页数据
            if(is_divPage && scrollState == OnScrollListener.SCROLL_STATE_IDLE && pageIndex < pageCount)
            {
                pageIndex += 1;//设置请求当前页码加1
                Thread thread = new Thread(runnable);
                thread.start();
            }
    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //现在 Bug初始情况下向下滑动也能翻页
        int lastVisibleItem = firstVisibleItem + visibleItemCount;//当前滑动到最后一项
        if(lastVisibleItem == totalItemCount && totalItemCount > 0)
        {
            is_divPage = true;
        }
    }
}

时间: 2024-12-25 06:40:43

Android ListView分页,动态添加数据的相关文章

Android之ListView动态添加数据(SQLiteOpenHelper类添加数据)

一.SQLiteOpenHelper类: 这次我们通过sqlite来动态添加数据,接下来我们创建一个openHelper.java,在前面sqlite博客中我们已经详细的讲了SQLite的创建及使用等操作,我们将在onCreate 创建方法中创建一张表和插入相关的值,通过db.execSQL()完成Sqlite的运行. ①openHelper2.java文件: public class openHelper2 extends SQLiteOpenHelper { private static f

Android HorizontalScrollView 水平滑动 在listview上面动态添加图片

Android HorizontalScrollView   水平滑动    listview 上动态添加图片 最近遇到了个 在listview展示广告的需要动态添加图片 如图: 使用了 horizontalScrollView   在listview上进行添加 java代码: package com.baozi.bzhorizontalscrollview; import java.util.ArrayList; import android.app.Activity; import andr

C#:使用ListView动态添加数据一直闪烁的解决办法

首先,自定义一个类ListViewNF,继承自 System.Windows.Forms.ListView using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace 你的名称空间 { class ListViewNF : System.Windows.Forms.ListView { public ListV

Android ListView分页加载(服务端+android端)Demo

Android ListView分页加载功能 在实际开发中经常用到,是每个开发者必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了测试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源代码: 服务端: 需要导入图中这几个jar包. 在运行Android端代码前,需要开启服务端: 下面先给出服务端的代码: 类EmpDataSource: package com.android

ListView分页加载数据

在android软件开发中,ListView是一种经常被用到的组件.当需要用到列表显示的时候,通常都会用到.而使用的过程中也可能出现一些问题.比如,一次性加载过多的Item对于手机有限的内存来说,是一种负担.于是就有了分页加载的技术,一般的说,分页的使用方式有两种,一是在滑动到底部的时候,自动加载下一部分的内容.另一种则是在底部添加一个类似按钮的控件,点击后加载内容.这里介绍的是第一种.同样的,代码来自github,网址是:https://github.com/nicolasjafelle/Pa

Android ListView分页载入(服务端+android端)Demo

Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEclipse,Android端使用Eclipse. 实现效果图: 服务端一共100条数据,共分四页,每页有25条数据. 源码: 服务端: 须要导入图中这几个jar包. 在执行Android端代码前,须要开启服务端: 以下先给出服务端的代码: 类EmpDataSource: package com.andr

Android --ListView分页

参考博客:Android ListView分页加载(服务端+android端)Demo 监听OnScrollListener事件 class OnListScrollListener implements AbsListView.OnScrollListener{ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { /** * 当分页操作is_divPage为true时.滑动停止时.且pa

H5动态添加数据-老牛大讲堂

一.怎样实现动态添加数据呢? 首先要获得数据.一般通过ajax获得数据(参考我写的ajax跨域通信).之后动态添加数据. 下面我从简单到复杂介绍一下动态添加数据. 例子一:首先编写json数据,然后动态添加数据. <html> <head> <meta charset="utf-8" /> <script type="text/javascript" src="../H/js/jquery-3.0.0.min.js

js表单动态添加数据并提交

情景1:已经存在form对象了,动态为form增加对象并提交 function formAppendSubmit(){ var myform=$('#newArticleForm'); //得到form对象 var tmpInput=$("<input type='text' name='blogArticleForm.articleContent'/>"); tmpInput.attr("value", myUeditor.window.getCont