`
肖默it
  • 浏览: 24539 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ListView 分页显示

 
阅读更多

ListView是Android中经常用到的一个控件,用来以列表的形式展示数据,但是当数据量过大时,会出现数据加载过慢,甚至是失去响应,我们可以用分页显示来处理这个问题。

下面的代码是我结合网上的资源整合的结果,感谢网友们的无私奉献!

实现思路,主要是监听scroll事件,加载新数据。

 

下面是代码:

  package com.ns.pagelist;

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

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;

public class PagesListActivity extends Activity implements OnClickListener,OnScrollListener{
	
	private ListView pageListView;
	private Button btnPre;
	private Button btnNext;
	
	private PageAdapter pageAdapter;//
	private static int laseItem = 0;
	private static int nowpage = 1;
	private List<Map<String, Object>> mData;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pageListView = (ListView)findViewById(R.id.page_list);
        btnPre = (Button)findViewById(R.id.buttonPre);
        btnNext = (Button)findViewById(R.id.buttonNext);
        
        //构建Loading布局
        LinearLayout searchLayout = new LinearLayout(this);
		// 水平方向的线性布局
		searchLayout.setOrientation(LinearLayout.HORIZONTAL);
		// 添加进度条
		ProgressBar progressBar = new ProgressBar(this);
		progressBar.setPadding(0, 0, 15, 0);
		searchLayout.addView(progressBar, new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT));

		// 添加文字,设置文字垂直居中
		TextView textView = new TextView(this);
		textView.setText("加载中...");
		textView.setGravity(Gravity.CENTER_VERTICAL);
		searchLayout.addView(textView, new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT,
				LinearLayout.LayoutParams.FILL_PARENT));

		// 同时将进展条和加载文字显示在中间
		searchLayout.setGravity(Gravity.CENTER);

		LinearLayout loadingLayout = new LinearLayout(this);
		loadingLayout.addView(searchLayout, new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT));

		loadingLayout.setGravity(Gravity.CENTER);
		// 加载到listActivity的底部
		pageListView.addFooterView(loadingLayout);
		pageListView.setOnScrollListener(this);

		mData = getData();
        
        pageAdapter = new PageAdapter(this);
        pageListView.setAdapter(pageAdapter);
        btnPre.setOnClickListener(this);
        btnNext.setOnClickListener(this);
        checkButton();
        
        
    }
    
  //点击左边的Button,表示向前翻页,索引值要减1.  
    public void leftView(){  
        nowpage--; 
        for (int i = 0; i < 10; i++) {
			mData.remove(mData.size() - 1);
		}
        //刷新ListView里面的数值。           
        pageAdapter.notifyDataSetChanged(); 
        
        pageListView.setSelection((nowpage - 1)*10 + 1);
          
        //检查Button是否可用。  
        checkButton();  
    }       
  //点击右边的Button,表示向后翻页,索引值要加1.  
    public void rightView(){  
    	nowpage++;
		mData.addAll(getData());
          
        //刷新ListView里面的数值。  
        pageAdapter.notifyDataSetChanged(); 
        pageListView.setSelection((nowpage - 1)*10 + 1);
          
        //检查Button是否可用。  
        checkButton();  
    }  
      
    public void checkButton(){  
        //索引值小于等于1,表示不能向前翻页了,以经到了第一页了。         //将向前翻页的按钮设为不可用。  
        if(nowpage <=1){  
            btnPre.setEnabled(false);  
        }  
        /*//值的长度减去前几页的长度,剩下的就是这一页的长度,如果这一页的长度比View_Count小,表示这是最后的一页了,后面在没有了。  
        //将向后翻页的按钮设为不可用。  
        else if(data.length - index*viewCount <= viewCount){  
            btnNext.setEnabled(false);  
        }*/  
          
        //否则将2个按钮都设为可用的。  
        else {  
           btnPre.setEnabled(true);  
           btnNext.setEnabled(true);  
        }  
          
    } 
    
    
    //自定义Adapter
    class PageAdapter extends BaseAdapter{
    	private LayoutInflater mInflater;
    	
    	public PageAdapter(Context context) {
			this.mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
            return mData.size(); 
		}

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

		@Override
		public long getItemId(int position) {
			return position;
		}

		public final class ViewHolder {
			public ImageView img;
			public TextView title;
			public TextView info;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			
			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = mInflater.inflate(R.layout.mylistitem, null);
				holder.img = (ImageView) convertView.findViewById(R.id.img);
				holder.title = (TextView) convertView.findViewById(R.id.title);
				holder.info = (TextView) convertView.findViewById(R.id.info);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			holder.img.setBackgroundResource((Integer) mData.get(position).get("img"));
			holder.title.setText((String) mData.get(position).get("title"));
			holder.info.setText((String) mData.get(position).get("info"));

			return convertView;
		}
    	
    }

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.buttonPre:
			leftView();
			break;

		case R.id.buttonNext:
			rightView();
			break;
		}
		
	}

	//监听Scroll事件,实现分页显示的关键
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
		//获取当前页面最后一条数据的位置
		laseItem = firstVisibleItem + visibleItemCount - 1;
		
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		
		//如果用户已经滚到最后一条数据,并且已经松手,则加载新的数据
		if (laseItem == pageAdapter.getCount() && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
			nowpage++;
			mData.addAll(getData());
			pageAdapter.notifyDataSetChanged();
			checkButton();
		}
		
	}
	
	private List<Map<String, Object>> getData() {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

		for (int i = 0; i < 10; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("title", nowpage + "ItEye" + (i + 1));
			map.put("info","独立之人格,自由之思想,如果视图正在滚动,此方法将被调用之前,滚动下一帧呈现。特别是,它会被调用之前调用getView。。。。。" + (i + 1));
			map.put("img", R.drawable.ic_launcher);
			list.add(map);
		}
		return list;
	}
}

 

下面是运行后的截图:


 
  • 大小: 79.8 KB
分享到:
评论

相关推荐

    listView分页显示 加载更多

    "ListView分页显示 加载更多"的功能是优化用户体验的重要手段,它允许用户在滚动到列表底部时动态加载更多的数据,而不是一次性加载所有内容,从而节省内存资源并提高应用性能。 在实现ListView分页加载更多功能时...

    ListView分页显示上一页和下一页

    "ListView分页显示上一页和下一页"这一主题,就是讨论如何实现ListView在用户滚动到列表底部时自动加载下一页数据,同时提供上一页的切换功能。 一、分页原理 分页的基本思想是将大量数据分为多个小部分(页)来...

    这是一个ListView分页显示的示例

    本示例"HeaderBottomListDemo"专注于实现ListView的分页加载功能,这在处理大数据集时尤为重要,因为它可以提高应用性能并优化用户体验。分页加载允许用户滚动到列表底部时加载更多数据,而不是一次性加载所有内容,...

    Android中Listview分页显示

    本文将详细讲解如何在Android中实现ListView的分页显示。 一、ListView基础 ListView是Android提供的一个可滚动视图,用于展示多个同类型的项。每个项通常由一个布局文件(XML)定义,通过Adapter进行数据绑定。...

    android listview 分页显示

    android listview 分页显示 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.addrlistview); // 加载Listview和2个Button ...

    android listview 分页显示 demo

    在这个"android listview 分页显示 demo"中,我们将探讨如何实现ListView的分页加载功能,同时利用Map进行图片缓存,以提高用户体验。 首先,分页加载是解决大数据量列表滚动卡顿的有效手段。在用户滚动到列表底部...

    Android Listview 分页显示与异步下载图片

    1. **ListView分页显示**:分页是将大数据集分割成小块(页面)来加载和显示,避免一次性加载所有数据导致内存消耗过高和应用响应变慢。在Android中,通常通过在ListView的Adapter中实现这个功能。例如,当用户滚动...

    使用listview分页显示数据

    分页显示是优化大型数据集显示的重要手段,它可以提高用户体验,避免一次性加载过多数据导致的内存压力和界面卡顿。本资源提供了一个自定义ListView结合分页功能的实践案例,包括代码实现和数据库操作,对于学习和...

    主题:ListView 分页显示

    本篇将详细讲解如何实现ListView的分页显示。 首先,我们需要理解ListView的三个核心组成部分: 1. **ListView**:这是一个视图容器,用于展示一列可滚动的项目。每个项目都是由ListView的子视图(如TextView、...

    基于VB6+ADO+ListView制作的一个数据库分页显示程序

    基于VB6+ADO+ListView制作的一个数据库分页显示程序 基于VB6+ADO+ListView制作的一个数据库分页显示程序是使用VB6开发的一款数据库分页显示程序,使用ADO(ActiveX Data Objects)技术访问数据库,并使用ListView...

    listview分页显示

    本篇文章将详细介绍如何在Android中实现ListView的分页显示。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成若干小部分,每次只加载一部分到ListView中,用户滚动到底部时再加载下一页。这种加载方式...

    VB ListView 数据分页处理

    在VB(Visual Basic)开发中,ListView控件是一种常见的组件,用于显示列表形式的数据,如文件、联系人等。在处理大量数据时,为了提高用户体验和应用程序性能,通常需要实现数据分页功能。本篇文章将深入探讨如何在...

    android listview分页查询显示

    在这个"android listview分页查询显示"的Demo中,我们将深入探讨如何实现这个功能,以及如何结合SQLite数据库进行数据管理。 首先,ListView的工作原理是通过Adapter来连接数据源和视图。Adapter负责将数据转化为...

    ListView分页显示

    1. 分页原理:ListView分页通常基于“懒加载”概念,即只有当用户滚动到列表底部时,才会加载更多的数据。这种方式可以减少初次加载时的数据量,提高应用性能。 2. 实现步骤: - 数据源:首先,你需要创建一个数据...

    WPF中ListView分页

    实现ListView分页通常需要以下步骤: 1. **创建数据源**:首先,你需要一个可分页的数据源。这通常是一个包含分页信息的ObservableCollection,如PagedCollectionView或自己实现的分页数据集。 2. **设置View**:...

    Android ListView分页功能源码

    在ListView分页加载中,我们通常会结合PagerAdapter或FragmentPagerAdapter来创建一个滑动页面的效果,这样用户可以逐页浏览内容,而不是一次性看到所有数据。这两种适配器用于在ViewPager中管理页面,与ListView...

    Android_ListView分页

    一、ListView分页原理 分页的基本思想是将大量数据分成若干个小部分(每部分称为一页),每次只加载一部分数据到ListView中,当用户滚动到底部时,再加载下一页的数据。这样既能保证界面的流畅性,又能有效利用系统...

    listview分页加载

    ListView的数据分页加载功能是提高用户体验和优化应用性能的关键技术。本篇文章将深入探讨如何在Android中实现ListView的分页加载。 首先,理解分页加载的概念至关重要。分页加载是指在用户滚动列表到底部时,应用...

    简单ListView分页Demo

    本示例"简单ListView分页Demo"旨在教你如何实现一个具有分页功能的ListView,以展示不同类型的音乐,如流行音乐和古典音乐,并根据类型显示不同数量的条目。我们将探讨以下几个关键知识点: 1. **ListView基础**: ...

    主题:ListView分页(带图片)显示用法案例

    主题:ListView分页(带图片)显示用法案例,主题:ListView分页(带图片)显示用法案例

Global site tag (gtag.js) - Google Analytics