listView的分页滑动

1.         ListView分页加载实现思路

实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载。

 1 [java] view plaincopyprint?
 2 import android.app.ListActivity;
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.view.Gravity;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 import android.widget.AbsListView;
 9 import android.widget.BaseAdapter;
10 import android.widget.ImageView;
11 import android.widget.LinearLayout;
12 import android.widget.ProgressBar;
13 import android.widget.TextView;
14 import android.widget.AbsListView.OnScrollListener;
15 import android.widget.LinearLayout.LayoutParams;
16 public class Test extends ListActivity implements OnScrollListener {
17     Aleph0 adapter = new Aleph0();
18     int lastItem = 0;
19     int mProgressStatus = 0;
20     private Handler mHandler = new Handler();
21     ProgressBar progressBar;
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24    LinearLayout searchLayout = new LinearLayout(this);
25    searchLayout.setOrientation(LinearLayout.HORIZONTAL);
26          progressBar = new ProgressBar(this);
27          progressBar.setPadding(0, 0, 15, 0);
28          searchLayout.addView(progressBar,new LinearLayout.LayoutParams(
29            LinearLayout.LayoutParams.WRAP_CONTENT,
30            LinearLayout.LayoutParams.WRAP_CONTENT
31          ));
32          TextView textView = new TextView(this);
33          textView.setText("加载中...");
34          textView.setGravity(Gravity.CENTER_VERTICAL);
35          searchLayout.addView(textView,new LinearLayout.LayoutParams(
36            LinearLayout.LayoutParams.FILL_PARENT,
37            LinearLayout.LayoutParams.FILL_PARENT
38          ));
39          searchLayout.setGravity(Gravity.CENTER);
40          LinearLayout loadingLayout = new LinearLayout(this);
41          loadingLayout.addView(searchLayout,new LinearLayout.LayoutParams(
42            LinearLayout.LayoutParams.WRAP_CONTENT,
43            LinearLayout.LayoutParams.WRAP_CONTENT
44          ));
45          loadingLayout.setGravity(Gravity.CENTER);
46         getListView().addFooterView(loadingLayout);
47         // Start lengthy operation in a background thread
48 //        new Thread(new Runnable() {
49 //            public void run() {
50 //                while (mProgressStatus < 100) {
51 //
52 //                    // Update the progress bar
53 //                    mHandler.post(new Runnable() {
54 //                        public void run() {
55 //                        progressBar.setProgress(mProgressStatus);
56 //                        }
57 //                    });
58 //                }
59 //            }
60 //        }).start();
61         registerForContextMenu(getListView());
62         setListAdapter(adapter);
63         getListView().setOnScrollListener(this);
64     }
65     public void onScroll(AbsListView v, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
66         lastItem = firstVisibleItem + visibleItemCount - 1 ;
67         System.out.println("lastItem:" + lastItem);
68     }
69     public void onScrollStateChanged(AbsListView v, int state) {
70     if(lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE){
71           adapter.count += 10;
72           adapter.notifyDataSetChanged();
73     }
74 //        if(state == OnScrollListener.SCROLL_STATE_IDLE ) {
75 //                adapter.count += 10;
76 //                adapter.notifyDataSetChanged();
77 //        }
78     }
79     class Aleph0 extends BaseAdapter {
80         int count = 10;
81         public int getCount() { return count; }
82         public Object getItem(int pos) { return pos; }
83         public long getItemId(int pos) { return pos; }
84         public View getView(int pos, View v, ViewGroup p) {
85                 TextView view = new TextView(Test.this);
86                 view.setText("entry " + pos);
87                 view.setHeight(90);
88                 return view;
89         }
90     }
91 }  

第二种。

  1 package com.notice.moredate;
  2
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5
  6 import android.app.Activity;
  7 import android.os.Bundle;
  8 import android.os.Handler;
  9 import android.view.View;
 10 import android.view.View.OnClickListener;
 11 import android.widget.AbsListView;
 12 import android.widget.AbsListView.OnScrollListener;
 13 import android.widget.Button;
 14 import android.widget.ListView;
 15 import android.widget.ProgressBar;
 16 import android.widget.SimpleAdapter;
 17 import android.widget.Toast;
 18
 19 public class MoreDateListActivity extends Activity implements OnScrollListener {
 20
 21     // ListView的Adapter
 22     private SimpleAdapter mSimpleAdapter;
 23     private ListView lv;
 24     private Button bt;
 25     private ProgressBar pg;
 26     private ArrayList<HashMap<String,String>> list;
 27     // ListView底部View
 28     private View moreView;
 29     private Handler handler;
 30     // 设置一个最大的数据条数,超过即不再加载
 31     private int MaxDateNum;
 32     // 最后可见条目的索引
 33     private int lastVisibleIndex;
 34
 35     /** Called when the activity is first created. */
 36     @Override
 37     public void onCreate(Bundle savedInstanceState) {
 38         super.onCreate(savedInstanceState);
 39         setContentView(R.layout.main);
 40
 41
 42         MaxDateNum = 22; // 设置最大数据条数
 43
 44         lv = (ListView) findViewById(R.id.lv);
 45
 46         // 实例化底部布局
 47         moreView = getLayoutInflater().inflate(R.layout.moredate, null);
 48
 49         bt = (Button) moreView.findViewById(R.id.bt_load);
 50         pg = (ProgressBar) moreView.findViewById(R.id.pg);
 51         handler = new Handler();
 52
 53         // 用map来装载数据,初始化10条数据
 54         list = new ArrayList<HashMap<String,String>>();
 55         for (int i = 0; i < 10; i++) {
 56             HashMap<String, String> map = new HashMap<String, String>();
 57             map.put("ItemTitle", "第" + i + "行标题");
 58             map.put("ItemText", "第" + i + "行内容");
 59             list.add(map);
 60         }
 61         // 实例化SimpleAdapter
 62         mSimpleAdapter = new SimpleAdapter(this, list, R.layout.item,
 63                 new String[] { "ItemTitle", "ItemText" },
 64                 new int[] { R.id.tv_title, R.id.tv_content });
 65         // 加上底部View,注意要放在setAdapter方法前
 66         lv.addFooterView(moreView);
 67         lv.setAdapter(mSimpleAdapter);
 68         // 绑定监听器
 69         lv.setOnScrollListener(this);
 70
 71         bt.setOnClickListener(new OnClickListener() {
 72
 73             @Override
 74             public void onClick(View v) {
 75                 pg.setVisibility(View.VISIBLE);// 将进度条可见
 76                 bt.setVisibility(View.GONE);// 按钮不可见
 77
 78                 handler.postDelayed(new Runnable() {
 79
 80                     @Override
 81                     public void run() {
 82                         loadMoreDate();// 加载更多数据
 83                         bt.setVisibility(View.VISIBLE);
 84                         pg.setVisibility(View.GONE);
 85                         mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新数据
 86                     }
 87
 88                 }, 2000);
 89             }
 90         });
 91
 92     }
 93
 94     private void loadMoreDate() {
 95         int count = mSimpleAdapter.getCount();
 96         if (count + 5 < MaxDateNum) {
 97             // 每次加载5条
 98             for (int i = count; i < count + 5; i++) {
 99                 HashMap<String, String> map = new HashMap<String, String>();
100                 map.put("ItemTitle", "新增第" + i + "行标题");
101                 map.put("ItemText", "新增第" + i + "行内容");
102                 list.add(map);
103             }
104         } else {
105             // 数据已经不足5条
106             for (int i = count; i < MaxDateNum; i++) {
107                 HashMap<String, String> map = new HashMap<String, String>();
108                 map.put("ItemTitle", "新增第" + i + "行标题");
109                 map.put("ItemText", "新增第" + i + "行内容");
110                 list.add(map);
111             }
112         }
113
114     }
115
116     @Override
117     public void onScroll(AbsListView view, int firstVisibleItem,
118             int visibleItemCount, int totalItemCount) {
119         // 计算最后可见条目的索引
120         lastVisibleIndex = firstVisibleItem + visibleItemCount - 1;
121
122         // 所有的条目已经和最大条数相等,则移除底部的View
123         if (totalItemCount == MaxDateNum + 1) {
124             lv.removeFooterView(moreView);
125             Toast.makeText(this, "数据全部加载完成,没有更多数据!", Toast.LENGTH_LONG).show();
126         }
127
128     }
129
130     @Override
131     public void onScrollStateChanged(AbsListView view, int scrollState) {
132         // 滑到底部后自动加载,判断listview已经停止滚动并且最后可视的条目等于adapter的条目
133         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
134                 && lastVisibleIndex == mSimpleAdapter.getCount()) {
135             // 当滑到底部时自动加载
136             // pg.setVisibility(View.VISIBLE);
137             // bt.setVisibility(View.GONE);
138             // handler.postDelayed(new Runnable() {
139             //
140             // @Override
141             // public void run() {
142             // loadMoreDate();
143             // bt.setVisibility(View.VISIBLE);
144             // pg.setVisibility(View.GONE);
145             // mSimpleAdapter.notifyDataSetChanged();
146             // }
147             //
148             // }, 2000);
149
150         }
151
152     }
153
154 }
时间: 2024-10-29 08:26:49

listView的分页滑动的相关文章

android listview左右滑动分页(viewpager嵌套listview进行分页),焦点图带圆焦点

1.先上图后说话 2.代码 package com.example.exmp; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import and

Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程大致分以下几步: 1.当前Activity implements OnScallListenner: 2.实现接口的方法: 3.ListView注册滚动监听: 4. Adapter(自定义或者安卓自带)为每个item填充数据: 5.获得第二页以后的数据后,adater增加数据并刷新notifyDat

Android中使用ListView实现分页刷新(线程休眠模拟)

当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程大致分以下几步: 1.当前Activity implements OnScallListenner: 2.实现接口的方法: 3.ListView注册滚动监听: 4. Adapter(自定义或者安卓自带)为每个item填充数据: 5.获得第二页以后的数据后,adater增加数据并刷新notifyDat

android UI进阶之实现listview的分页加载

 分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一下子全部加载用户未读的微薄这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了.通过分页分次加载数据,用户看多少就去加载多少. 通常这也分为两种方式,一种是设置一个按钮,用户点击即加载.另一种是当用户滑动到底部时自动加载.今天我就和大家分享一下这个功能的实现. 首先,

ListView实现分页加载(一)制作Demo

一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下:                                               效果说明:我们向上滑动ListView的时候,当滑动的最底部, 便会出现正在加载的进度条,当加载完成后,会出现加载后的数据.如此反复,这其实就是ListView的分页加载功能.像这样的工能,实在是太常见了.那么它是怎么实现的呢? 实现原理很简单,本质上,其实就是一个自定义的ListV

Android 监听ListView、GridView滑动到底部

// 监听listview滚到最底部mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (view.get

android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中没有数据. 如下面的代码: 这就是在initData中异步获取服务器的数据,然后实例化adatper,再将adapter赋给listView. 2.initData()中的代码是: 这里线程要睡眠5秒钟,是为了模仿网络的耗时操作 3.Handler: 在Handler中接收到数据后给list赋值后,

重写ListView解决ListView内部ViewPaper滑动事件冲突问题

很简单 重写ListView 其他类似问题解决ScrollView嵌套ViewPager出现的滑动冲突问题 http://blog.csdn.net/zhangyiacm/article/details/37903071 package com.zy.myview; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import androi

修改listview默认的滑动条

首先把布局文件中李斯特view添加android:fastScrollEnabled="true": 然后代码中添加代码: private void setScrollBar() { try { Field f = AbsListView.class.getDeclaredField("mFastScroller"); f.setAccessible(true); Object o = f.get(listview); f = f.getType().getDecl