ListView分页展示数据功能一(按钮方式)

      我们在看微博或是到网上商城如淘宝中购物时,每一个商家都会有很多商品,如果把某商家的所有商品都一次性加载过来,会造成手机卡顿,影响用户体验,所以每次加载少量数据,使用分页的形式,分多页加载,会很好的提高用户体验度,这是一个使用按钮实现分页的demo。后面附有项目源码,可以下载。


效果图:


布局:

activity_main.xml中代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

listview_item.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/list_item_text"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:textSize="20sp" />

</LinearLayout>

load_data.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="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/loadMoreButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="loadMore"
        android:text="加载更多" />

</LinearLayout>


后台逻辑:

MainActivity.java中代码:

package com.demo.listviewpageadddatas1;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnScrollListener {
	public static final String TAG = "MainActivity";
	List<String> items = new ArrayList<String>();
	private ListView listView;
	private int visibleLastIndex = 0; // 最后的可视项索引
	private int visibleItemCount; // 当前窗口可见项总数
	private ListViewAdapter adapter;
	private View loadMoreView;
	private Button loadMoreButton;
	private Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * 动态加载包含有‘加载更多’按钮的布局
		 */
		loadMoreView = getLayoutInflater().inflate(R.layout.load_data, null);
		/**
		 * 从loadMoreView布局中取出按钮控件
		 */
		loadMoreButton = (Button) loadMoreView
				.findViewById(R.id.loadMoreButton);
		/**
		 * 绑定loadMoreButton按钮点击事件
		 */
		loadMoreButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				/**
				 * 给loadMoreButton按钮设置文本文字
				 */
				loadMoreButton.setText("正在加载..."); // 设置按钮文字loading
				/**
				 * handler.postDelayed(runnable, 1000);
				 * 是一个定时器,后面的1000指的是每隔一秒执行一次runnable中的方法 ;
				 * 如果想要关闭此定时器,可以这样操作handler.removeCallbacks(runnable);
				 */
				handler.postDelayed(new Runnable() {
					@Override
					public void run() {
						Log.d(TAG, "---进入handler.postDelayed()方法");
						loadData();
						adapter.notifyDataSetChanged(); // 数据集变化后,通知adapter
						listView.setSelection(visibleLastIndex
								- visibleItemCount + 1); // 设置选中项
						loadMoreButton.setText("加载更多"); // 恢复按钮文字
						Log.d(TAG, "---离开handler.postDelayed()方法");
					}
				}, 1000);
			}
		});
		/**
		 * 获得ListView控件对象
		 */
		listView = (ListView) this.findViewById(R.id.listView1);
		/**
		 * 给ListView的最后一个View追加一个View:loadMoreView
		 */
		listView.addFooterView(loadMoreView); // 设置列表底部视图
		// listView.addHeaderView(v) //设置列表顶部视图
		initAdapter();
		listView.setAdapter(adapter); // 自动为id是list的ListView设置适配器
		listView.setOnScrollListener(this); // 添加滑动监听
		/**
		 * 给ListView的子项绑定点击事件
		 */
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View view,
					int position, long arg3) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), items.get(position),
						Toast.LENGTH_SHORT).show();
			}
		});
	}

	/**
	 * 初始化适配器
	 */
	private void initAdapter() {
		for (int i = 0; i < 10; i++) {
			items.add("数据_"+(i + 1));
		}
		adapter = new ListViewAdapter(items, this);
	}

	/**
	 * 正在滚动时回调,回调2-3次,手指做了抛的动作(手指离开屏幕前,用力滑了一下),回调三次,否则回调两次
	 */
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// 回调顺序如下
		// 第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
		// 第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下)
		// 第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动
		// 当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1;
		// 由于用户的操作,屏幕产生惯性滑动时为2
		Log.d(TAG, "-----进入onScrollStateChanged()方法,scrollState=" + scrollState);
		int itemsLastIndex = adapter.getCount() - 1; // 数据集最后一项的索引
		int lastIndex = itemsLastIndex + 1; // 加上底部的loadMoreView项
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
				&& visibleLastIndex == lastIndex) {
			// 如果是自动加载,可以在这里放置异步加载数据的代码
			Log.i("LOADMORE", "loading...");
			Log.d(TAG, "-----如果是自动加载,可以在这里放置异步加载数据的代码");
		}
		Log.d(TAG, "-----离开onScrollStateChanged()方法");
	}

	/**
	 * 滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 1.firstVisibleItem:当前能看见的第一个列表项ID(从0开始);
	 * 2.visibleItemCount:当前能看见的列表项个数(小半个也算) ; 3.totalItemCount:列表项共数
	 */
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		Log.d(TAG, "----进入onScroll()方法");
		Log.d(TAG, "----item总数totalItemCount:" + totalItemCount);
		Log.d(TAG, "----visibleItemCount:" + visibleItemCount);
		Log.d(TAG, "----firstVisibleItem:" + firstVisibleItem);
		this.visibleItemCount = visibleItemCount;
		visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
		Log.d(TAG, "----离开onScroll()方法");
	}

	/**
	 * 模拟加载数据
	 */
	private void loadData() {
		int count = adapter.getCount();
		for (int i = count; i < count + 10; i++) {
			adapter.addItem("加载新数据_"+(i + 1));
		}
	}

}

ListViewAdapter.java中代码
package com.demo.listviewpageadddatas1;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListViewAdapter extends BaseAdapter {
	private static Map<Integer, View> m = new HashMap<Integer, View>();

	private List<String> items;
	private LayoutInflater inflater;

	public ListViewAdapter(List<String> items, Context context) {
		super();
		this.items = items;
		this.inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return items.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return items.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View contentView, ViewGroup parent) {
		// TODO Auto-generated method stub
		contentView = m.get(position);
		if (contentView == null) {
			contentView = inflater.inflate(R.layout.listview_item, null);
			TextView text = (TextView) contentView
					.findViewById(R.id.list_item_text);
			text.setText(items.get(position));
		}
		m.put(position, contentView);
		return contentView;
	}

	public void addItem(String item) {
		items.add(item);
	}
}



项目下载:








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值