ListView动态加载效果

ListView要动态加载请求数据,我们就需要监测ListView的滑动状态,当滑动到最后一条数据的时候,我们就去请求下一页的数据,所以我们需要监听OnScrollListener用来监听滑动状态,

ListView.setOnScrollListener();

下面是一个简单的Demo实现:

XML配置文件有二个:

footer_more.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="horizontal" >
    
    <ProgressBar android:id="@+id/pd_load_more"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        style="@android:style/Widget.ProgressBar.Small.Inverse"
        android:indeterminate="true"/>

    <TextView android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="数据加载中..."/>
</LinearLayout>


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="ListView滑动加载效果"
        android:textSize="18sp"/>
    <ListView android:id="@+id/query_listView" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@android:color/transparent" >
    </ListView>

</LinearLayout>


实现类

package com.example.sample;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class LoadMoreDemoActivity extends Activity implements OnScrollListener{
	
	SimpleAdapter adapter;
	ListView listView;
	View footView;
	ProgressBar load_progressBar;
	TextView  load_textView;
	
	/**
	 * 数据集合
	 */
	List<Map<String, String>> data;
	
	/**
	 * 每次新加载的数据量
	 */
	private int requestSize = 10;
	
	/**
	 * 滑动到最后一条数据
	 */
	private int lastItem;
	
	/**
	 * 加载完成的标记位
	 */
	private static final int LOAD_DATA_FINISHED = 1;
	
	/**
	 * 加载完成后更新Adapter的Handler
	 */
	Handler handler = new Handler(){
		
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case LOAD_DATA_FINISHED:
				load_textView.setText("");
				load_progressBar.setVisibility(View.GONE);
				
				if(adapter != null){
					adapter.notifyDataSetChanged();
				}
				break;

			default:
				break;
			}
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		listView = (ListView)findViewById(R.id.query_listView);
		
		footView = getLayoutInflater().inflate(R.layout.footer_more, null);
		
		load_progressBar = (ProgressBar)footView.findViewById(R.id.pd_load_more);
		load_textView = (TextView)footView.findViewById(R.id.loading);
		
		listView.addFooterView(footView);
		
		initData();
		
		adapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"item","name"}, new int[]{android.R.id.text1,android.R.id.text2});
		listView.setAdapter(adapter);
		
		listView.setOnScrollListener(this);
		
	}
	
	private void initData(){
		data = new ArrayList<Map<String,String>>();
		for(int i = 0;i< 20;i++){
			Map<String, String> map = new HashMap<String, String>();
			map.put("item", i+"");
			map.put("name", "测试数据--"+i);
			data.add(map);
		}
	}

	private void loadMoreData() {
		
		load_textView.setText("数据加载中...");
		load_progressBar.setVisibility(View.VISIBLE);
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {

				if(lastItem<100){
					for(int i = lastItem;i< lastItem+requestSize;i++){
						Map<String, String> map = new HashMap<String, String>();
						map.put("item", i+"");
						map.put("name", "测试数据--"+i);
						data.add(map);
					}
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					handler.sendEmptyMessage(LOAD_DATA_FINISHED);
				}else{
					handler.postDelayed(new Runnable() {
						
						@Override
						public void run() {
							load_textView.setText("数据加载完啦...");
							load_progressBar.setVisibility(View.GONE);
						}
					}, 1000);
				}
			}
		}).start();
	}
	
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		//是否到达listView的最后一条
		if(lastItem == adapter.getCount() && scrollState == OnScrollListener.SCROLL_STATE_IDLE){
			loadMoreData();
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		//页面上可见的最后一条记录的位置
		lastItem = firstVisibleItem + visibleItemCount - 1;
	}
}

效果图:

                        

 


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值