Android ListView专题之十二 分页不同的解决方案

方法一
问题
ListView 内容循环显示大家试想 假如ListView待显示的数据很庞大 从0-100 如果按照ListView默认行为 用户要找到50记录 可能要滚动很久 这显然会影响用户体验 本文的宗旨:解决这一问题
思路
1. 自定义BaseAdapter
2. 其 getCount() 返回一个固定值 比如:5 那么ListView就会只显示5个记录
3. 其 getView() 必须返回0-100记录 但需要分批显示 那如何实现呢?
定义 int index = 0; 用于记录显示当前数据的次序 用户显示下批数据 那么index++ 反之 显示以前 就index-
遗留问题
Java代码
public class ItemAdapter extends BaseAdapter {
Activity a;
public int getCount()
}
{
public long getItemId(int position)
public View getView(int position, View convertView, ViewGroup parent)
}
public class ListMoreTest extends Activity {
}
方法二
layout中的 list_item.xml源码:
view plain
1. <span style="font-size:13px;"><?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout
3. xmlns:android="http://schemas.android.com/apk/res/android"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. android:orientation="vertical">
7. <TextView
8. android:id="@+id/newstitle"
9. android:layout_width="fill_parent"
10. android:layout_height="wrap_content"/>
11. <TextView
12. android:id="@+id/newscontent"
13. android:layout_width="fill_parent"
14. android:layout_height="wrap_content"/>
15. </LinearLayout></span>
layout中loadmore.xml源码:
view plain
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout
3. xmlns:android="http://schemas.android.com/apk/res/android"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent">
6. <Button
7. android:id="@+id/loadMoreButton"
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:text="查看更多..." />
11. </LinearLayout>
layout中main.xml源码:
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent">
6. <ListView
7. android:id="@+id/lvNews"
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"/>
10. </LinearLayou
包 com.andyidea.bean中News.java类源码:
1.
public class News {
2.
3.
private String title;
//标题
4.
private String content;
//内容
5.
6.
public String getTitle() {
7.
return title;
8.
}
9.
public void setTitle(String title) {
10.
this.title = title;
11.
}
12.
public String getContent() {
13.
return content;
14.
}
15.
public void setContent(String content) {
16.
this.content = content;
17.
}
18.
19. }
包com.andyidea.listview中paginationListViewActivi ty.java类源码:
2.
public class PaginationListViewActivi ty extends Activity implements OnScrollListener {
3.
4.
private ListView listView;
5.
private int visibleLastIndex = 0;
//最后的可视项索引
6.
private int visibleItemCount;
// 当前窗口可见项总数
7.
private int datasize = 38;
//模拟数据集的条数
8.
private PaginationAdapter adapter;
9.
private View loadMoreView;
10.
private Button loadMoreButton;
11.
private Handler handler = new Handler();
14.
@Override
15.
public void onCreate(Bundle savedInstanceState) {
16.
super.onCreate(savedInstanceState);
17.
setContentView(R.layout.main);
18.
19.
loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
20.
loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);
21.
loadMoreButton.setOnClickListener(new View.OnClickListener() {
22.
23.
@Override
24.
public void onClick(View v) {
25.
loadMoreButton.setText("正在加载中...");
//设置按钮文字
26.
handler.postDelayed(new Runnable() {
27.
28.
@Override
29.
public void run() {
30.
loadMoreData();
31.
adapter.notifyDataSetChanged();
32.
loadMoreButton.setText("查看更多...");
//恢复按钮文字
33.
}
34.
},2000);
35.
36.
}
37.
});
38.
39.
listView = (ListView)findViewById(R.id.lvNews);
40.
listView.addFooterView(loadMoreView);
//设置列表底部视图
41.
initializeAdapter();
42.
listView.setAdapter(adapter);
43.
listView.setOnScrollListener(this);
44.
}
45.
46.
@Override
47.
public void onScrollStateChanged(AbsListView view, int scrollState) {
48.
int itemsLastIndex = adapter.getCount()-1;
//数据集最后一项的索引
49.
int lastIndex = itemsLastIndex + 1;
50.
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
51.
&& visibleLastIndex == lastIndex) {
52.
// 如果是自动加载,可以在这里放置异步加载数据的代码
53.
}
54.
}
55.
56.
57.
@Override
58. public void onScroll(AbsListView view, int firstVisibleItem,
59. int visibleItemCount, int totalItemCount) {
60.
this.visibleItemCount = visibleItemCount;
61.
visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
62.
63.
Log.e("========================= ","========================");
64.
Log.e("firstVisibleItem = ",firstVisibleItem+"");
65.
Log.e("visibleItemCount = ",visibleItemCount+"");
66.
Log.e("totalItemCount = ",totalItemCount+"");
67.
Log.e("========================= ","========================");
68.
69.
//如果所有的记录选项等于数据集的条数,则移除列表底部视图
70.
if(totalItemCount == datasize+1){
71.
listView.removeFooterView(loadMoreView);
72.
Toast.makeText(this, "数据全部加载完!", Toast.LENGTH_LONG).show();
73.
}
74.
}
75.
76.
79.
private void initializeAdapter(){
80.
List<News> newnews = new ArrayList<News>();
81.
for(int i=1;i<=10;i++){
82.
News items = new News();
83.
items.setTitle("Title"+i);
84.
items.setContent("This is News Content"+i);
85.
news.add(items);
86.
}
87.
adapter = new PaginationAdapter(news);
88.
}
89.
90.
93.
private void loadMoreData(){
94.
int count = adapter.getCount();
95.
96.
if(count+10 <= datasize){
97.
for(int i=count+1; i<=count+10; i++){
98.
News item = new News();
99.
item.setTitle("Title"+i);
100.
item.setContent("This is News Content"+i);
101.
adapter.addNewsItem(item);
102.
}
103.
}else{
104.
for(int i=count+1; i<=datasize; i++){
105.
News item = new News();
106.
item.setTitle("Title"+i);
107.
item.setContent("This is News Content"+i);
108.
adapter.addNewsItem(item);
109.
}
110.
}
111.
112.
}
113.
114.
115.
class PaginationAdapter extends BaseAdapter{
116.
117.
List<News> newsItems;
118.
119.
public PaginationAdapter(List<News> newsitems){
120.
this.newsItems = newsitems;
121.
}
122.
123.
@Override
124.
public int getCount() {
125.
return newsItems.size();
126.
}
127.
128.
@Override
129.
public Object getItem(int position) {
130.
return newsItems.get(position);
131.
}
132.
133.
@Override
134.
public long getItemId(int position) {
135.
return position;
136.
}
137.
138.
@Override
139.
public View getView(int position, View view, ViewGroup parent) {
140.
if(view == null){
141.
view = getLayoutInflater().inflate(R.layout.list_item, null);
142.
}
143.
144.
//新闻标题
145.
TextView tvTitle = (TextView)view.findViewById(R.id.newstitle);
146.
tvTitle.setText(newsItems.get(position).getTitle());
147.
//新闻内容
148.
TextView tvContent = (TextView)view.findViewById(R.id.newscontent);
149.
tvContent.setText(newsItems.get(position).getContent());
150.
151.
return view;
152.
}
153.
154.
158.
public void addNewsItem(News newsitem){
159.
newsItems.add(newsitem);
160.
}
161.
162.
}
163.
164. }
通过上面的截图,当我们点击"查看更多..."按钮时,就会加载下10条记录,当加载完所有的记录后,ListView的底部视图将会移除。
方法三
实现思路如下:
public class MainActivity extends ListActivity implements OnScrollListener {
}
}