`

Android分页控件xlistview

阅读更多

strings.xml

-------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="hello">Hello World, XListViewActivity!</string>

    <string name="app_name">XListView</string>

    <string name="xlistview_header_hint_normal">下拉刷新</string>

    <string name="xlistview_header_hint_ready">松开刷新数据</string>

    <string name="xlistview_header_hint_loading">正在加载...</string>

    <string name="xlistview_header_last_time">上次更新时间:</string>

    <string name="xlistview_footer_hint_normal">查看更多</string>

    <string name="xlistview_footer_hint_ready">松开载入更多</string>

</resources>

 

activity_main.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" android:background="#f0f0f0">

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/hello" />

    <com.xlistview.view.XListView

        android:id="@+id/xListView"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent" android:cacheColorHint="#00000000">

    </com.xlistview.view.XListView>

</LinearLayout>

xlistview_header.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="wrap_content"

    android:gravity="bottom" >

    <RelativeLayout

        android:id="@+id/xlistview_header_content"

        android:layout_width="fill_parent"

        android:layout_height="60dp" >

        <LinearLayout

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerInParent="true"

            android:gravity="center"

            android:orientation="vertical" android:id="@+id/xlistview_header_text">

 

            <TextView

                android:id="@+id/xlistview_header_hint_textview"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:text="@string/xlistview_header_hint_normal" />

            <LinearLayout

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_marginTop="3dp" >

                <TextView

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:text="@string/xlistview_header_last_time"

                    android:textSize="12sp" />

                <TextView

                    android:id="@+id/xlistview_header_time"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:textSize="12sp" />

            </LinearLayout>

        </LinearLayout>

        <ImageView

            android:id="@+id/xlistview_header_arrow"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignLeft="@id/xlistview_header_text"

            android:layout_centerVertical="true"

            android:layout_marginLeft="-35dp"

            android:src="@drawable/xlistview_arrow" />

        <ProgressBar

            android:id="@+id/xlistview_header_progressbar"

            android:layout_width="30dp"

            android:layout_height="30dp"

            android:layout_alignLeft="@id/xlistview_header_text"

            android:layout_centerVertical="true"

            android:layout_marginLeft="-40dp"

            android:visibility="invisible" />

    </RelativeLayout>

</LinearLayout>

 

 

 

xlistview_footer.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="wrap_content" >

    <RelativeLayout

        android:id="@+id/xlistview_footer_content"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:padding="10dp" >

        <ProgressBar

            android:id="@+id/xlistview_footer_progressbar"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerInParent="true"

            android:visibility="invisible" />

        <TextView

            android:id="@+id/xlistview_footer_hint_textview"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_centerInParent="true"

            android:text="@string/xlistview_footer_hint_normal" />

    </RelativeLayout>

</LinearLayout>

 

 

 

list_item.xml

-------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/list_item_textview"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:padding="5dp"

    android:textColor="#000"

    android:textSize="16sp" >

 

</TextView>

 

XListView.java

-------------------------------------------------------------------------------------------------------------------------------

package com.xlistview.view;

 

import com.xlistview.R;

 

import android.annotation.SuppressLint;

import android.content.Context;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewTreeObserver.OnGlobalLayoutListener;

import android.view.animation.DecelerateInterpolator;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.ListAdapter;

import android.widget.ListView;

import android.widget.RelativeLayout;

import android.widget.Scroller;

import android.widget.TextView;

 

/**

 * 

 * 项目名称:XListView   

 * 类  名  称:XListView   

 * 类  描  述:

 * An ListView support (a) Pull down to refresh, (b) Pull up to load more.

 * Implement IXListViewListener, and see stopRefresh() / stopLoadMore().   

 * 创  建  人:fy   

 * 创建时间:2014-3-16 下午5:16:28   

 * Copyright (c) 方勇-版权所有

 */

public class XListView extends ListView implements OnScrollListener {

 

private float mLastY = -1; // save event y

private Scroller mScroller; // used for scroll back

private OnScrollListener mScrollListener; // user's scroll listener

 

// the interface to trigger refresh and load more.

private IXListViewListener mListViewListener;

 

// -- header view

private XListViewHeader mHeaderView;

// header view content, use it to calculate the Header's height. And hide it

// when disable pull refresh.

private RelativeLayout mHeaderViewContent;

private TextView mHeaderTimeView;

private int mHeaderViewHeight; // header view's height

private boolean mEnablePullRefresh = true;

private boolean mPullRefreshing = false; // is refreashing.

 

// -- footer view

private XListViewFooter mFooterView;

private boolean mEnablePullLoad;

private boolean mPullLoading;

private boolean mIsFooterReady = false;

 

// total list items, used to detect is at the bottom of listview.

private int mTotalItemCount;

 

// for mScroller, scroll back from header or footer.

private int mScrollBack;

private final static int SCROLLBACK_HEADER = 0;

private final static int SCROLLBACK_FOOTER = 1;

 

private final static int SCROLL_DURATION = 400; // scroll back duration

private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px

                                                    // at bottom, trigger

                                                    // load more.

private final static float OFFSET_RADIO = 1.8f; // support iOS like pull

                                                // feature.

 

/**

 * @param context

 */

public XListView(Context context) {

super(context);

initWithContext(context);

}

 

public XListView(Context context, AttributeSet attrs) {

super(context, attrs);

initWithContext(context);

}

 

public XListView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

initWithContext(context);

}

 

@SuppressLint("NewApi")

    private void initWithContext(Context context) {

mScroller = new Scroller(context, new DecelerateInterpolator());

// XListView need the scroll event, and it will dispatch the event to

// user's listener (as a proxy).

super.setOnScrollListener(this);

 

// init header view

mHeaderView = new XListViewHeader(context);

mHeaderViewContent = (RelativeLayout) mHeaderView.findViewById(R.id.xlistview_header_content);

mHeaderTimeView = (TextView) mHeaderView.findViewById(R.id.xlistview_header_time);

addHeaderView(mHeaderView);

 

// init footer view

mFooterView = new XListViewFooter(context);

 

// init header height

mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

mHeaderViewHeight = mHeaderViewContent.getHeight();

//getViewTreeObserver().removeOnGlobalLayoutListener(this);

getViewTreeObserver().removeGlobalOnLayoutListener(this);

}

});

}

 

@Override

public void setAdapter(ListAdapter adapter) {

// make sure XListViewFooter is the last footer view, and only add once.

if (mIsFooterReady == false) {

mIsFooterReady = true;

addFooterView(mFooterView);

}

super.setAdapter(adapter);

}

 

/**

 * enable or disable pull down refresh feature.

 * 

 * @param enable

 */

public void setPullRefreshEnable(boolean enable) {

mEnablePullRefresh = enable;

if (!mEnablePullRefresh) { // disable, hide the content

mHeaderViewContent.setVisibility(View.INVISIBLE);

} else {

mHeaderViewContent.setVisibility(View.VISIBLE);

}

}

 

/**

 * enable or disable pull up load more feature.

 * 

 * @param enable

 */

public void setPullLoadEnable(boolean enable) {

mEnablePullLoad = enable;

if (!mEnablePullLoad) {

mFooterView.hide();

mFooterView.setOnClickListener(null);

} else {

mPullLoading = false;

mFooterView.show();

mFooterView.setState(XListViewFooter.STATE_NORMAL);

// both "pull up" and "click" will invoke load more.

mFooterView.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

startLoadMore();

}

});

}

}

 

/**

 * stop refresh, reset header view.

 */

public void stopRefresh() {

if (mPullRefreshing == true) {

mPullRefreshing = false;

resetHeaderHeight();

}

}

 

/**

 * stop load more, reset footer view.

 */

public void stopLoadMore() {

if (mPullLoading == true) {

mPullLoading = false;

mFooterView.setState(XListViewFooter.STATE_NORMAL);

}

}

 

/**

 * set last refresh time

 * 

 * @param time

 */

public void setRefreshTime(String time) {

mHeaderTimeView.setText(time);

}

 

private void invokeOnScrolling() {

if (mScrollListener instanceof OnXScrollListener) {

OnXScrollListener l = (OnXScrollListener) mScrollListener;

l.onXScrolling(this);

}

}

 

private void updateHeaderHeight(float delta) {

mHeaderView.setVisiableHeight((int) delta + mHeaderView.getVisiableHeight());

if (mEnablePullRefresh && !mPullRefreshing) { // 未处于刷新状态,更新箭头

if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {

mHeaderView.setState(XListViewHeader.STATE_READY);

} else {

mHeaderView.setState(XListViewHeader.STATE_NORMAL);

}

}

setSelection(0); // scroll to top each time

}

 

/**

 * reset header view's height.

 */

private void resetHeaderHeight() {

int height = mHeaderView.getVisiableHeight();

if (height == 0) // not visible.

return;

// refreshing and header isn't shown fully. do nothing.

if (mPullRefreshing && height <= mHeaderViewHeight) {

return;

}

int finalHeight = 0; // default: scroll back to dismiss header.

// is refreshing, just scroll back to show all the header.

if (mPullRefreshing && height > mHeaderViewHeight) {

finalHeight = mHeaderViewHeight;

}

mScrollBack = SCROLLBACK_HEADER;

mScroller.startScroll(0, height, 0, finalHeight - height, SCROLL_DURATION);

// trigger computeScroll

invalidate();

}

 

private void updateFooterHeight(float delta) {

int height = mFooterView.getBottomMargin() + (int) delta;

if (mEnablePullLoad && !mPullLoading) {

if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load

                                 // more.

mFooterView.setState(XListViewFooter.STATE_READY);

} else {

mFooterView.setState(XListViewFooter.STATE_NORMAL);

}

}

mFooterView.setBottomMargin(height);

 

// setSelection(mTotalItemCount - 1); // scroll to bottom

}

 

private void resetFooterHeight() {

int bottomMargin = mFooterView.getBottomMargin();

if (bottomMargin > 0) {

mScrollBack = SCROLLBACK_FOOTER;

mScroller.startScroll(0, bottomMargin, 0, -bottomMargin, SCROLL_DURATION);

invalidate();

}

}

 

private void startLoadMore() {

mPullLoading = true;

mFooterView.setState(XListViewFooter.STATE_LOADING);

if (mListViewListener != null) {

mListViewListener.onLoadMore();

}

}

 

@Override

public boolean onTouchEvent(MotionEvent ev) {

if (mLastY == -1) {

mLastY = ev.getRawY();

}

 

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

mLastY = ev.getRawY();

break;

case MotionEvent.ACTION_MOVE:

final float deltaY = ev.getRawY() - mLastY;

mLastY = ev.getRawY();

if (getFirstVisiblePosition() == 0 && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {

// the first item is showing, header has shown or pull down.

updateHeaderHeight(deltaY / OFFSET_RADIO);

invokeOnScrolling();

} else if (getLastVisiblePosition() == mTotalItemCount - 1 && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {

// last item, already pulled up or want to pull up.

updateFooterHeight(-deltaY / OFFSET_RADIO);

}

break;

default:

mLastY = -1; // reset

if (getFirstVisiblePosition() == 0) {

// invoke refresh

if (mEnablePullRefresh && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {

mPullRefreshing = true;

mHeaderView.setState(XListViewHeader.STATE_REFRESHING);

if (mListViewListener != null) {

mListViewListener.onRefresh();

}

}

resetHeaderHeight();

} else if (getLastVisiblePosition() == mTotalItemCount - 1) {

// invoke load more.

if (mEnablePullLoad && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {

startLoadMore();

}

resetFooterHeight();

}

break;

}

return super.onTouchEvent(ev);

}

 

@Override

public void computeScroll() {

if (mScroller.computeScrollOffset()) {

if (mScrollBack == SCROLLBACK_HEADER) {

mHeaderView.setVisiableHeight(mScroller.getCurrY());

} else {

mFooterView.setBottomMargin(mScroller.getCurrY());

}

postInvalidate();

invokeOnScrolling();

}

super.computeScroll();

}

 

@Override

public void setOnScrollListener(OnScrollListener l) {

mScrollListener = l;

}

 

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

if (mScrollListener != null) {

mScrollListener.onScrollStateChanged(view, scrollState);

}

}

 

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

// send to user's listener

mTotalItemCount = totalItemCount;

if (mScrollListener != null) {

mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);

}

}

 

public void setXListViewListener(IXListViewListener l) {

mListViewListener = l;

}

 

/**

 * you can listen ListView.OnScrollListener or this one. it will invoke

 * onXScrolling when header/footer scroll back.

 */

public interface OnXScrollListener extends OnScrollListener {

public void onXScrolling(View view);

}

 

/**

 * implements this interface to get refresh/load more event.

 */

public interface IXListViewListener {

public void onRefresh();

 

public void onLoadMore();

}

}

 

 

XListViewHeader.java

-------------------------------------------------------------------------------------------------------------------------------

package com.xlistview.view;

import com.xlistview.R;

 

import android.content.Context;

import android.util.AttributeSet;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.RotateAnimation;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ProgressBar;

import android.widget.TextView;

 

/**

 * 

 * 项目名称:XListView   

 * 类  名  称:XListViewHeader   

 * 类  描  述:自定义tbar布局   

 * 创  建  人:fy   

 * 创建时间:2014-3-16 下午4:21:36   

 * Copyright (c) 方勇-版权所有

 */

public class XListViewHeader extends LinearLayout {

/* tbar容器 */

private LinearLayout mContainer;

/* tbar容器->图标 */

private ImageView mArrowImageView;

/* tbar容器->进度条 */

private ProgressBar mProgressBar;

/* tbar容器->文本 */

private TextView mHintTextView;

private int mState = STATE_NORMAL;

 

private Animation mRotateUpAnim;

private Animation mRotateDownAnim;

 

private final int ROTATE_ANIM_DURATION = 180;

/* 1、无动画 */

public final static int STATE_NORMAL = 0;

/* 3、显示箭头图标 */

public final static int STATE_READY = 1;

/* 2、显示进度条 */

public final static int STATE_REFRESHING = 2;

 

public XListViewHeader(Context context) {

super(context);

initView(context);

}

 

public XListViewHeader(Context context, AttributeSet attrs) {

super(context, attrs);

initView(context);

}

 

private void initView(Context context) {

// 初始情况,设置下拉刷新view高度为0

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0);

mContainer = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.xlistview_header, null);

/* Adds a child view with the specified layout parameters. */

addView(mContainer, lp);

/* Describes how the child views are positioned. Defaults to GRAVITY_TOP */

setGravity(Gravity.BOTTOM);

 

mArrowImageView = (ImageView) findViewById(R.id.xlistview_header_arrow);

mHintTextView = (TextView) findViewById(R.id.xlistview_header_hint_textview);

mProgressBar = (ProgressBar) findViewById(R.id.xlistview_header_progressbar);

// 旋转动画

mRotateUpAnim = new RotateAnimation(0.0f, -180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);

mRotateUpAnim.setFillAfter(true);

mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);

mRotateDownAnim.setFillAfter(true);

}

 

public void setState(int state) {

if (state == mState)

return;

 

if (state == STATE_REFRESHING) { // 显示进度

mArrowImageView.clearAnimation();

mArrowImageView.setVisibility(View.INVISIBLE);

mProgressBar.setVisibility(View.VISIBLE);

} else { // 显示箭头图片

mArrowImageView.setVisibility(View.VISIBLE);

mProgressBar.setVisibility(View.INVISIBLE);

}

 

//三个状态的动画效果切换

switch (state) {

case STATE_NORMAL:

if (mState == STATE_READY) {

mArrowImageView.startAnimation(mRotateDownAnim);

}

if (mState == STATE_REFRESHING) {

mArrowImageView.clearAnimation();

}

mHintTextView.setText(R.string.xlistview_header_hint_normal);

break;

case STATE_READY:

if (mState != STATE_READY) {

mArrowImageView.clearAnimation();

mArrowImageView.startAnimation(mRotateUpAnim);

mHintTextView.setText(R.string.xlistview_header_hint_ready);

}

break;

case STATE_REFRESHING:

mHintTextView.setText(R.string.xlistview_header_hint_loading);

break;

default:

}

 

mState = state;

}

 

public void setVisiableHeight(int height) {

if (height < 0)

height = 0;

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer.getLayoutParams();

lp.height = height;

mContainer.setLayoutParams(lp);

}

 

public int getVisiableHeight() {

return mContainer.getHeight();

}

 

}

 

 

XListViewFooter.java

-------------------------------------------------------------------------------------------------------------------------------

package com.xlistview.view;

 

import com.xlistview.R;

 

import android.content.Context;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.TextView;

 

/**

 * 

 * 项目名称:XListView   

 * 类  名  称:XListViewFooter   

 * 类  描  述:自定义bbar布局   

 * 创  建  人:fy   

 * 创建时间:2014-3-16 下午5:02:38   

 * Copyright (c) 方勇-版权所有

 */

public class XListViewFooter extends LinearLayout {

/* 1、无动画 */

public final static int STATE_NORMAL = 0;

/* 3、显示箭头图标 */

public final static int STATE_READY = 1;

/* 2、显示进度条 */

public final static int STATE_LOADING = 2;

 

private Context mContext;

/* bbar容器 */

private View mContentView;

/* bbar容器->进度条 */

private View mProgressBar;

/* bbar容器->文本 */

private TextView mHintView;

 

public XListViewFooter(Context context) {

super(context);

initView(context);

}

 

public XListViewFooter(Context context, AttributeSet attrs) {

super(context, attrs);

initView(context);

}

 

public void setState(int state) {

mHintView.setVisibility(View.INVISIBLE);

mProgressBar.setVisibility(View.INVISIBLE);

mHintView.setVisibility(View.INVISIBLE);

// 手指向上滑动,显示松开载入更多

if (state == STATE_READY) {

mHintView.setVisibility(View.VISIBLE);

mHintView.setText(R.string.xlistview_footer_hint_ready);

} else if (state == STATE_LOADING) {// 手指点击查看更多,显示进度条

mProgressBar.setVisibility(View.VISIBLE);

} else {// 查看更多

mHintView.setVisibility(View.VISIBLE);

mHintView.setText(R.string.xlistview_footer_hint_normal);

}

}

 

/*设置底部布局高度*/

public void setBottomMargin(int height) {

if (height < 0)

return;

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView.getLayoutParams();

lp.bottomMargin = height;

mContentView.setLayoutParams(lp);

}

 

/*获取底部布局高度*/

public int getBottomMargin() {

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView.getLayoutParams();

return lp.bottomMargin;

}

 

/**

 * normal status

 */

public void normal() {

mHintView.setVisibility(View.VISIBLE);

mProgressBar.setVisibility(View.GONE);

}

 

/**

 * loading status 

 */

public void loading() {

mHintView.setVisibility(View.GONE);

mProgressBar.setVisibility(View.VISIBLE);

}

 

/**

 * hide footer when disable pull load more

 */

public void hide() {

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView.getLayoutParams();

lp.height = 0;

mContentView.setLayoutParams(lp);

}

 

/**

 * show footer

 */

public void show() {

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView.getLayoutParams();

lp.height = LayoutParams.WRAP_CONTENT;

mContentView.setLayoutParams(lp);

}

 

private void initView(Context context) {

mContext = context;

LinearLayout moreView = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);

addView(moreView);

moreView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

 

mContentView = moreView.findViewById(R.id.xlistview_footer_content);

mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar);

mHintView = (TextView) moreView.findViewById(R.id.xlistview_footer_hint_textview);

}

}

MainActivity.java

-------------------------------------------------------------------------------------------------------------------------------

package com.xlistview;

 

import java.util.ArrayList;

 

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.widget.ArrayAdapter;

 

import com.xlistview.view.XListView;

import com.xlistview.view.XListView.IXListViewListener;

/**

 * 

 * 项目名称:com.xlistview   

 * 类  名  称:MainActivity   

 * 类  描  述: 分页 版listview 

 * 创  建  人:fy   

 * 创建时间:2014-3-18 下午2:17:47   

 * Copyright (c) 方勇-版权所有

 */

public class MainActivity extends Activity implements IXListViewListener {

/* 分页列表控件 */

private XListView mListView;

/* 分页列表控件-->适配器 */

private ArrayAdapter<String> mAdapter;

/* 分页列表控件-->适配器数据 */

private ArrayList<String> items = new ArrayList<String>();

/* 在子线程中异步更新UI数据 */

private Handler mHandler;

/* 总记录数 */

private int start = 0;

/* 递增变量 */

private static int refreshCnt = 0;

 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

geneItems();

findViews();

setListeners();

initView();

mHandler = new Handler();

}

 

private void findViews() {

mListView = (XListView) findViewById(R.id.xListView);

}

 

private void setListeners() {

mListView.setXListViewListener(this);

}

 

private void initView() {

mListView.setPullLoadEnable(true);

mAdapter = new ArrayAdapter<String>(this, R.layout.list_item, items);

mListView.setAdapter(mAdapter);

}

 

/* 默认20条数据为一页 */

private void geneItems() {

for (int i = 0; i != 20; ++i) {

items.add("refresh cnt " + (++start));

}

}

 

/* 停止tbar、bbar,更新时间 */

private void onLoad() {

mListView.stopRefresh();

mListView.stopLoadMore();

mListView.setRefreshTime("刚刚");

}

 

/* tbar刷新数据 */

@Override

public void onRefresh() {

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

start = ++refreshCnt;

items.clear();

geneItems();

// mAdapter.notifyDataSetChanged();

mAdapter = new ArrayAdapter<String>(MainActivity.this, R.layout.list_item, items);

mListView.setAdapter(mAdapter);

onLoad();

}

}, 2000);

}

 

/* bbar更新更多 */

@Override

public void onLoadMore() {

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

geneItems();

// 局部适配器数据

mAdapter.notifyDataSetChanged();

onLoad();

}

}, 2000);

}

}

 

效果

-------------------------------------------------------------------------------------------------------------------------------

 

 

<!--EndFragment-->
  • 大小: 8.5 KB
  • 大小: 6.6 KB
  • 大小: 4.5 KB
  • 大小: 6.1 KB
  • 大小: 40.7 KB
  • 大小: 40.8 KB
  • 大小: 41.3 KB
  • 大小: 41.8 KB
  • 大小: 40.7 KB
0
0
分享到:
评论

相关推荐

    安卓Android源码——XListview实现上拉刷新下拉加载功能.zip

    2. 在XML布局文件中添加XListView控件,并设置必要的属性,如id、宽高、背景色等。 3. 在Activity或Fragment中找到XListView实例,设置监听器。 4. 实现`onRefresh`和`onLoadMore`方法,执行实际的刷新和加载操作。...

    Android应用源码之XListView--master.zip

    XListView的设计思路和实现原理是理解Android自定义控件、事件处理以及数据加载策略的关键。 1. **XListView的基本结构** XListView是由一个ListView和两个可滑动的Header(下拉刷新)和Footer(上拉加载)组成。...

    xlistview分页加载数据

    这里我们关注的是“Xlistview分页加载数据”,这涉及到一个开源库——XListView,它是一个适用于Android的可滚动列表视图,支持上拉加载更多和下拉刷新功能。 XListView是基于ListView的扩展,它提供了更丰富的交互...

    Android应用源码之XListview实现上拉刷新下拉加载功能.zip

    - 在布局XML文件中添加XListView控件,设置相关属性,如id、宽高、背景等。 - 初始化XListView:在Activity或Fragment中找到该View并实例化,设置适配器,然后设置上拉刷新和下拉加载的监听器。 - 实现刷新和加载...

    Node.js-本工程将开源的XListView控件提取出来

    【描述】:“本工程将开源的XListView控件提取出来,方便自己自定义header跟footer”,这一描述指出,这是一个关于Android开发的项目,它涉及到了一个特定的UI组件——XListView。这个控件是针对列表视图ListView的...

    xlistview demo

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。`XListView`是ListView的一个增强版,它提供了下拉刷新和上拉加载更多功能,极大地提升了用户体验。本篇将详细介绍`XListView`的原理、使用...

    Android实现异步从网络加载图片列表和上拉加载更多、下拉刷新列表(使用xListView框架)

    首先,xListView是Android平台上的一个开源库,它扩展了原生的ListView组件,提供了更丰富的功能,包括下拉刷新和上拉加载更多。这两个特性在现代应用中非常常见,它们使得用户能够在滚动到底部时加载更多数据,或者...

    自定义XListView

    ListView是Android原生的一个视图控件,用于显示大量数据的列表,而XListView则在此基础上增加了交互性,使用户能够更方便地与数据集进行互动。 1. **上拉刷新(Pull-to-Refresh)**:当用户将列表拉至顶部并松手时,...

    使用XListView实现listview的下拉刷新和上拉加载功能

    在Android开发中,ListView是常用的数据展示控件,但原生的ListView并不支持下拉刷新和上拉加载更多这样的交互功能。为了解决这个问题,开发者通常会借助第三方库,如本话题中的XListView。XListView是一款强大的...

    xlistview_刷新与加载

    在Android开发中,`XListView`是一个非常常用的控件,它扩展了标准的`ListView`,提供了上拉加载更多和下拉刷新的功能。这个控件使得用户在滚动到底部时可以自动加载更多数据,而在顶部则可以触发刷新操作,极大地...

    XListView开源库

    XListView开源库是一款在Android平台上广泛使用的开源组件,主要用于实现列表视图的下拉刷新和上拉加载功能。这个库极大地增强了原生ListView的功能,使得开发者在构建具有动态加载和刷新功能的应用时更加便捷。 ...

    XlistView Demo(上拉加载,下拉刷新)

    这个Demo主要展示了如何集成并实现XlistView控件,以及利用其特性进行上拉加载更多数据和下拉刷新数据的功能。XlistView是ListView的一个增强版,它集成了PullToRefresh开源库,为开发者提供了更加便捷的滚动刷新和...

    XListView的使用

    在Android开发中,XListView是一款常用的可定制化的列表控件,它提供了丰富的功能,如下拉刷新、上拉加载更多、以及添加头视图和尾视图等。这些特性使得开发者能够构建出更加互动和动态的用户界面。下面将详细阐述...

    android listview

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。本篇文章将深入探讨“android listview”相关的知识点,包括横向ListView、微信风格的ListView以及XListView的优化。 首先,我们来看“横向...

    XlistView.rar

    - 创建XML布局:在布局文件中添加XListView控件,并设置相应的属性。 - 初始化XListView:在Activity或Fragment的onCreate方法中初始化XListView,设置监听器。 - 实现监听器:实现onRefresh()和onLoadMore()方法...

    Android下拉刷新ListView

    总的来说,"Android下拉刷新ListView"是Android开发中的一个重要知识点,它涉及到自定义控件、滑动事件监听、界面动画和网络数据的分页加载。掌握这个技能有助于提升应用的用户体验,并且通过学习开源库的源码,...

    Android_listview

    总结,`Android_listview`工具包通过XListView组件为开发者提供了强大的ListView功能扩展,包括下拉刷新和分页加载,极大地简化了开发过程,提升了应用的用户体验。理解并熟练运用这些功能,可以使你的Android应用在...

    XListView 下拉刷新,上拉更多 效果很好(最新改良)

    在Android开发中,ListView是一种常用的控件,用于展示大量数据列表。然而,为了提供更好的用户体验,开发者经常需要在ListView的基础上实现“下拉刷新”和“上拉加载更多”的功能。XListView是一个专为此目的设计的...

    Fragment+ListView下拉加载上拉刷新

    ListView本身是Android中的一个列表视图控件,用于展示大量可滚动的数据项。而XListView增加了额外的功能,使得用户在到达列表顶部时可以触发下拉操作来加载更多数据(上拉加载更多在到达底部时触发)。XListView...

    listview上下拉刷新

    在Android开发中,ListView是一种...总之,XListView是一个强大且易于使用的Android控件,它为开发者提供了实现上下拉刷新和加载更多的便利。通过正确配置和使用XListView,可以提升应用的用户体验,同时简化开发过程。

Global site tag (gtag.js) - Google Analytics