如何在Android listview中实现分页
Posted
技术标签:
【中文标题】如何在Android listview中实现分页【英文标题】:How to implement pagination in Android listview 【发布时间】:2013-05-15 17:28:04 【问题描述】:我正在为 android 应用程序工作,我需要在其中显示带有项目的列表视图。但是列表视图中要显示更多元素。
我决定实现分页。我尝试在 Google 中搜索,但没有找到任何相关信息。
谁能帮帮我..
【问题讨论】:
什么样的导航?您可以在列表项单击后简单地创建一个活动 对不起我的错误。请检查编辑的问题.. CommonWare 的EndlessAdapter
是一种常用的列表分页方法。或者,您可以自己实现分页逻辑,或使用例如按钮从一页转到下一页。
【参考方案1】:
实现分页非常简单。
看看这个……
public class MainActivity extends Activity
private ListView listview;
private TextView title;
private ArrayList<String> data;
ArrayAdapter<String> sd;
public int TOTAL_LIST_ITEMS = 1030;
public int NUM_ITEMS_PAGE = 100;
private int noOfBtns;
private Button[] btns;
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView)findViewById(R.id.list);
title = (TextView)findViewById(R.id.title);
Btnfooter();
data = new ArrayList<String>();
/*
* The ArrayList data contains all the list items
*/
for(int i=0;i<TOTAL_LIST_ITEMS;i++)
data.add("This is Item "+(i+1));
loadList(0);
CheckBtnBackGroud(0);
private void Btnfooter()
int val = TOTAL_LIST_ITEMS%NUM_ITEMS_PAGE;
val = val==0?0:1;
noOfBtns=TOTAL_LIST_ITEMS/NUM_ITEMS_PAGE+val;
LinearLayout ll = (LinearLayout)findViewById(R.id.btnLay);
btns = new Button[noOfBtns];
for(int i=0;i<noOfBtns;i++)
btns[i] = new Button(this);
btns[i].setBackgroundColor(getResources().getColor(android.R.color.transparent));
btns[i].setText(""+(i+1));
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
ll.addView(btns[i], lp);
final int j = i;
btns[j].setOnClickListener(new OnClickListener()
public void onClick(View v)
loadList(j);
CheckBtnBackGroud(j);
);
/**
* Method for Checking Button Backgrounds
*/
private void CheckBtnBackGroud(int index)
title.setText("Page "+(index+1)+" of "+noOfBtns);
for(int i=0;i<noOfBtns;i++)
if(i==index)
btns[index].setBackgroundDrawable(getResources().getDrawable(R.drawable.box_green));
btns[i].setTextColor(getResources().getColor(android.R.color.white));
else
btns[i].setBackgroundColor(getResources().getColor(android.R.color.transparent));
btns[i].setTextColor(getResources().getColor(android.R.color.black));
/**
* Method for loading data in listview
* @param number
*/
private void loadList(int number)
ArrayList<String> sort = new ArrayList<String>();
int start = number * NUM_ITEMS_PAGE;
for(int i=start;i<(start)+NUM_ITEMS_PAGE;i++)
if(i<data.size())
sort.add(data.get(i));
else
break;
sd = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
sort);
listview.setAdapter(sd);
Xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_
android:layout_
android:textColor="@android:color/black"
android:gravity="center"
android:textSize="16sp"
android:background="@android:color/darker_gray"
android:padding="10dp"/>
<ListView
android:id="@+id/list"
android:divider="#000"
android:dividerHeight="1dp"
android:cacheColorHint="#00000000"
android:layout_
android:layout_
android:layout_weight="1"
android:fadingEdge="none"/>
<HorizontalScrollView
android:layout_
android:layout_>
<LinearLayout
android:id="@+id/btnLay"
android:layout_
android:layout_
android:orientation="horizontal" >
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
如需更清晰的解释和源代码,请访问此链接
ListView Pagination Ex-1
ListView Pagination Ex-2
【讨论】:
【参考方案2】:我已经创建了这个自定义列表视图。
package com.pixecon.custom.views;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.FrameLayout;
import android.widget.ListView;
public class PagingListView extends ListView
boolean needScroll = true;
private String TAG = "CustomListView";
public PagingListView(Context context, AttributeSet attrs)
super(context, attrs);
public void setNeedScroll(boolean needScroll)
this.needScroll = needScroll;
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
if (!needScroll)
return false;
else
return super.onInterceptTouchEvent(event);
@Override
public void setOnScrollListener(OnScrollListener l)
super.setOnScrollListener(l);
public void onScrollStarted()
//Scroll Started.
public void onScrollStopped()
centralizeTheView();
private void centralizeTheView()
int height = getResources().getDisplayMetrics().heightPixels;
int centerY = height / 2;
int visibleFirstItemPosition = getFirstVisiblePosition();
int visibleLastItemPosition = getLastVisiblePosition();
Log.d(TAG, "visibleFirstVisible = " + visibleFirstItemPosition);
Log.d(TAG, "visibleLastVisible = " + visibleLastItemPosition);
//TODO: Check the calcualted value and reconfirm.
int firstPositionInGroup = visibleFirstItemPosition % 2 - 1;
if (firstPositionInGroup < 0)
firstPositionInGroup = 0;
FrameLayout layout = (FrameLayout) getChildAt(firstPositionInGroup);
int bottom = layout.getBottom();
//Calculate the exact bottom of the view by subtracting
if (bottom > centerY)
Log.d(TAG, "First Item - " + visibleFirstItemPosition);
/*listView.smoothScrollBy(3, 1);*/
//listView.smoothScrollToPosition(visibleFirstItemPosition);
setSelection(visibleFirstItemPosition);
else
Log.d(TAG, "Last Item - " + visibleLastItemPosition);
/*listView.smoothScrollBy(-3, 1);*/
//listView.smoothScrollToPosition(visibleLastItemPosition);
setSelection(visibleLastItemPosition);
【讨论】:
您忘了强调应该实现 ScrollListener 来处理滚动更改状态并调用 onScrollStoped。以上是关于如何在Android listview中实现分页的主要内容,如果未能解决你的问题,请参考以下文章