【问题标题】:How to implement pagination in Android listview如何在Android listview中实现分页
【发布时间】:2013-05-15 17:28:04
【问题描述】:

我正在为 Android 应用程序工作,我需要在其中显示带有项目的列表视图。但是列表视图中要显示更多元素。

我决定实现分页。我尝试在 Google 中搜索,但没有找到任何相关信息。

谁能帮帮我..

【问题讨论】:

  • 什么样的导航?您可以在列表项单击后简单地创建一个活动
  • 对不起我的错误。请检查编辑的问题..
  • CommonWare 的EndlessAdapter 是一种常用的列表分页方法。或者,您可以自己实现分页逻辑,或使用例如按钮从一页转到下一页。

标签: android listview navigation


【解决方案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_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    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_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:fadingEdge="none"/>

<HorizontalScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:id="@+id/btnLay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2016-07-16
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多