`
龙哥IT
  • 浏览: 254599 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

ListView的动态加载-很简单的Demo

阅读更多

ListView的动态加载,想必大家在网上都看过很多资料了。我在这里也不罗嗦,提供非常简单的Demo给一些需要的人。

这个Demo里面只有两个部分,
Activity做显示,以及一个Factory创建信息。

MainActivity.java

Java代码 复制代码 收藏代码
  1. package com.demo;   
  2.   
  3. import java.util.List;   
  4. import android.app.Activity;   
  5. import android.os.Bundle;   
  6. import android.os.Handler;   
  7. import android.view.LayoutInflater;   
  8. import android.view.View;   
  9. import android.view.ViewGroup;   
  10. import android.widget.AbsListView;   
  11. import android.widget.BaseAdapter;   
  12. import android.widget.ListView;   
  13. import android.widget.TextView;   
  14. import android.widget.Toast;   
  15. import android.widget.AbsListView.OnScrollListener;   
  16. import android.widget.AdapterView;   
  17. import android.widget.AdapterView.OnItemClickListener;   
  18.   
  19. public class MainActivity extends Activity implements OnScrollListener,OnItemClickListener {   
  20.        
  21.      private ListView listView;    
  22.      private List<String> currentData;//当前视图显示的数据   
  23.      private CustomAdapter customadapter;//自定义适配器   
  24.      private View loadingView;//加载视图的布局   
  25.         
  26.      private int currentPage = 1;//当前页,默认为1   
  27.      private int pageSize = 10;//每页显示十条信息   
  28.      private int last_item_position;//最后item的位置   
  29.         
  30.      private boolean isLoading = false;//是否加载过,控制加载次数   
  31.      public void onCreate(Bundle savedInstanceState) {   
  32.        super.onCreate(savedInstanceState);   
  33.           
  34.        setContentView(R.layout.main);   
  35.           
  36.        listView=(ListView)findViewById(R.id.lv_id);   
  37.           
  38.        //加载视图布局   
  39.        loadingView = LayoutInflater.from(this).inflate(R.layout.list_page_load, null);    
  40.        //创建当前用于显示视图的数据   
  41.        currentData=CreateDataFactory.createUpdateData(currentPage,pageSize);   
  42.        //添加底部加载视图   
  43.        listView.addFooterView(loadingView);   
  44.        //初始化适配器   
  45.        customadapter=new CustomAdapter();   
  46.        listView.setAdapter(customadapter);   
  47.        //滚动条监听   
  48.        listView.setOnScrollListener(this);   
  49.        //ListView监听   
  50.        listView.setOnItemClickListener(this);   
  51.     }   
  52.        
  53.     @Override  
  54.     public void onScroll(AbsListView view, int firstVisibleItem,   
  55.             int visibleItemCount, int totalItemCount) {   
  56.            
  57.         last_item_position = firstVisibleItem + visibleItemCount - 1;   
  58.            
  59.         if(last_item_position==totalItemCount-2){//这里控制当焦点落在某一个位置时,开始加载.   
  60.                                                  //当前是在第9个位置开始加载,改为totalItemCount-1   
  61.                                                  //则会在第10个位置开始加载   
  62.                    
  63.             System.out.println("开始加载..");   
  64.                        
  65.                 Toast.makeText(MainActivity.this"第 "+currentPage+" 页", Toast.LENGTH_LONG).show();   
  66.                            
  67.                     if(!isLoading){   
  68.                         new Thread(){   
  69.                             public void run() {   
  70.                                 isLoading = true;   
  71.                                 //开启一个线程加载数据,否则会堵塞当前线程   
  72.                                 updateCurrendData();   
  73.                                 //发送一个消息,通知数据加载完成   
  74.                                 loadingHandler.sendEmptyMessage(0);   
  75.                             }   
  76.                         }.start();   
  77.                         }   
  78.             }   
  79.                
  80.         //当ListView没有FooterView时,添加FooterView(---loadingView---)   
  81.             if(listView.getFooterViewsCount()==0){   
  82.                  listView.addFooterView(loadingView);   
  83.             }   
  84.     }   
  85.        
  86.     @Override  
  87.     public void onScrollStateChanged(AbsListView view, int scrollState) {   
  88.         // TODO Auto-generated method stub   
  89.     }   
  90.        
  91.     Handler loadingHandler = new Handler(){   
  92.         public void handleMessage(android.os.Message msg) {   
  93.                
  94.         //修改adapter count     
  95.         customadapter.count = currentPage*pageSize;    
  96.         //更新   
  97.         customadapter.notifyDataSetChanged();   
  98.         //消除MSG   
  99.         loadingHandler.removeMessages(0);   
  100.         //删除FooterView   
  101.         listView.removeFooterView(loadingView);   
  102.         //进入下一页,此时视图未加载.   
  103.         isLoading = false;   
  104.         };   
  105.     };   
  106.        
  107.     //添加List元素   
  108.     private void updateCurrendData(){   
  109.         //模拟联接网络以及从网络中获取数据花费的时间   
  110.         try {   
  111.             Thread.sleep(3000);   
  112.         } catch (InterruptedException e) {   
  113.             // TODO Auto-generated catch block   
  114.             e.printStackTrace();   
  115.         }   
  116.         //更新一次,当前页加1   
  117.         currentPage++;   
  118.         //获取当前要更新的数据   
  119.         List<String> updateDataList = CreateDataFactory.createUpdateData(currentPage, pageSize);   
  120.         //需要更新的数据加入当前数据集合   
  121.         for(String itemData:updateDataList){   
  122.             currentData.add(itemData);   
  123.         }   
  124.     }   
  125.        
  126.     class CustomAdapter extends BaseAdapter{   
  127.            
  128.         int count=currentData.size();   
  129.   
  130.         @Override  
  131.         public int getCount() {   
  132.             // TODO Auto-generated method stub   
  133.             return count;   
  134.         }   
  135.   
  136.         @Override  
  137.         public Object getItem(int position) {   
  138.             // TODO Auto-generated method stub   
  139.             return position;   
  140.         }   
  141.   
  142.         @Override  
  143.         public long getItemId(int position) {   
  144.             // TODO Auto-generated method stub   
  145.             return position;   
  146.         }   
  147.   
  148.         @Override  
  149.         public View getView(int position, View convertView, ViewGroup parent) {   
  150.             View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.list_page_item, null);   
  151.             TextView tv_content = (TextView) view.findViewById(R.id.tv_content);   
  152.             tv_content.setText(currentData.get(position));   
  153.             return view;   
  154.         }   
  155.     }   
  156.        
  157.     @Override  
  158.     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {   
  159.         // TODO Auto-generated method stub   
  160.     }   
  161. }  
package com.demo;

import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity implements OnScrollListener,OnItemClickListener {
	
	 private ListView listView; 
	 private List<String> currentData;//当前视图显示的数据
	 private CustomAdapter customadapter;//自定义适配器
	 private View loadingView;//加载视图的布局
	 
	 private int currentPage = 1;//当前页,默认为1
	 private int pageSize = 10;//每页显示十条信息
	 private int last_item_position;//最后item的位置
	 
	 private boolean isLoading = false;//是否加载过,控制加载次数
	 public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       
       setContentView(R.layout.main);
       
       listView=(ListView)findViewById(R.id.lv_id);
       
       //加载视图布局
       loadingView = LayoutInflater.from(this).inflate(R.layout.list_page_load, null); 
       //创建当前用于显示视图的数据
       currentData=CreateDataFactory.createUpdateData(currentPage,pageSize);
	   //添加底部加载视图
	   listView.addFooterView(loadingView);
	   //初始化适配器
	   customadapter=new CustomAdapter();
	   listView.setAdapter(customadapter);
	   //滚动条监听
	   listView.setOnScrollListener(this);
	   //ListView监听
	   listView.setOnItemClickListener(this);
	}
	
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		
		last_item_position = firstVisibleItem + visibleItemCount - 1;
		
		if(last_item_position==totalItemCount-2){//这里控制当焦点落在某一个位置时,开始加载.
			                                     //当前是在第9个位置开始加载,改为totalItemCount-1
												 //则会在第10个位置开始加载
				
			System.out.println("开始加载..");
					
				Toast.makeText(MainActivity.this, "第 "+currentPage+" 页", Toast.LENGTH_LONG).show();
						
					if(!isLoading){
						new Thread(){
							public void run() {
								isLoading = true;
								//开启一个线程加载数据,否则会堵塞当前线程
								updateCurrendData();
								//发送一个消息,通知数据加载完成
								loadingHandler.sendEmptyMessage(0);
							}
						}.start();
						}
			}
			
		//当ListView没有FooterView时,添加FooterView(---loadingView---)
			if(listView.getFooterViewsCount()==0){
				 listView.addFooterView(loadingView);
			}
	}
	
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub
	}
	
	Handler loadingHandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			
		//修改adapter count  
		customadapter.count = currentPage*pageSize; 
   		//更新
		customadapter.notifyDataSetChanged();
   		//消除MSG
   		loadingHandler.removeMessages(0);
   		//删除FooterView
   		listView.removeFooterView(loadingView);
   		//进入下一页,此时视图未加载.
   		isLoading = false;
		};
	};
	
	//添加List元素
	private void updateCurrendData(){
		//模拟联接网络以及从网络中获取数据花费的时间
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//更新一次,当前页加1
		currentPage++;
		//获取当前要更新的数据
		List<String> updateDataList = CreateDataFactory.createUpdateData(currentPage, pageSize);
		//需要更新的数据加入当前数据集合
		for(String itemData:updateDataList){
			currentData.add(itemData);
		}
	}
	
	class CustomAdapter extends BaseAdapter{
		
		int count=currentData.size();

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

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.list_page_item, null);
			TextView tv_content = (TextView) view.findViewById(R.id.tv_content);
			tv_content.setText(currentData.get(position));
			return view;
		}
	}
	
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// TODO Auto-generated method stub
	}
}




CreateDataFactory.java

Java代码 复制代码 收藏代码
  1. package com.demo;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.HashMap;   
  5. import java.util.List;   
  6. import java.util.Map;   
  7.   
  8. public class CreateDataFactory {   
  9.   
  10.      public static List<String> createUpdateData(int currentPage,int pageSize){   
  11.          List<String> list=new ArrayList<String>();   
  12.          for(int i=(currentPage-1)*pageSize;i<currentPage*pageSize;i++){   
  13.              list.add((i+1)+". 走在风中,今天阳光突然很温柔.");    
  14.              }    
  15.          return list;    
  16.          }}  
package com.demo;

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

public class CreateDataFactory {

	 public static List<String> createUpdateData(int currentPage,int pageSize){
		 List<String> list=new ArrayList<String>();
		 for(int i=(currentPage-1)*pageSize;i<currentPage*pageSize;i++){
			 list.add((i+1)+". 走在风中,今天阳光突然很温柔."); 
			 } 
		 return list; 
		 }}



CreateDataFactory模拟了网络调取API获取信息的实现,以及API数据分页。对于ListView的优化,以及滑动事件的监听还没去完善。不过这些代码对想学习ListView的动态加载,以及分页显示来说以及够了。

分享到:
评论

相关推荐

    ListView-Snapshot-Demo,使用ListView快照Android库的演示Android应用程序.zip

    【标题】: "ListView-Snapshot-Demo" 是一个基于Android平台的开源项目,它展示了如何使用ListView快照库来优化应用程序的性能。 【描述】: 这个zip文件包含了一个名为"ListView-Snapshot-Demo"的Android应用示例,...

    安卓listview相关相关-android-movies-demo手势交互的listview.rar

    本示例"android-movies-demo手势交互的listview.rar"似乎是一个包含了手势交互功能的ListView实现,旨在帮助开发者学习如何为ListView添加丰富的用户交互体验。在这个项目中,我们可能会看到以下几个关键知识点: 1...

    ListView异步加载网络大图Demo

    这篇教程"ListView异步加载网络大图Demo"主要讲解如何高效地在ListView中异步加载网络图片,以避免性能问题。 首先,我们需要理解Bitmap对象在Android中的内存管理。Bitmap是Android用来存储像素信息的类,占用大量...

    ListView动态加载

    然而,ListView的动态加载和它与ScrollView的兼容性问题,是开发者经常遇到的挑战。下面我们将深入探讨这两个主题。 **ListView动态加载** 动态加载,也称为懒加载,是为了提高应用性能和用户体验而采用的一种策略...

    最简单可用listview上拉刷新下拉加载demo

    总之,"最简单可用listview上拉刷新下拉加载demo"是一个帮助初学者快速理解和实践ListView动态加载功能的实例。通过学习和理解这个示例,开发者可以为自己的应用添加类似的功能,提高用户体验。在实际项目中,你可能...

    ListView 动态加载数据

    朋友你是不是也想对其优化,形成动态加载? 如果你也有过这样的想法,那么我们是同路人! 通过查看ListView的API,我们似乎找不到这样的接口来满足我们的需求,怎么办呢?不要忘记,我们不只是程序员,我们同样也...

    ListView底部加载更多demo

    在这个"ListView底部加载更多demo"中,开发者可能会提供一个简单的数据模型(如User或Article),一个自定义Adapter,一个包含滚动监听器的Activity或Fragment,以及用于加载数据的辅助类。通过分析和学习这个demo,...

    安卓listview相关相关-listview滑动到底部自动加载数据并显示滚动的底部的那个条目点击按钮回到顶部.zip

    总的来说,这个压缩包提供了一个Android ListView的实战案例,涵盖了无限滚动加载和返回顶部的功能,对于学习和理解Android开发中的ListView使用和优化具有很高的价值。在实际学习中,开发者应结合源代码和提供的...

    自定义ListView实现下拉刷新+加载更多功能Demo

    这个"自定义ListView实现下拉刷新+加载更多功能Demo"旨在帮助开发者理解如何集成这样的交互效果到他们的应用中。 首先,下拉刷新功能(Pull-to-Refresh)让用户可以通过在ListView顶部向下拉动来刷新数据。这种功能...

    listview上拉加载下拉刷新demo

    `listview上拉加载下拉刷新demo`是一个示例项目,它演示了如何为ListView实现上拉加载更多和下拉刷新的功能,这对于处理长列表数据流的应用场景非常重要。这种功能可以提升用户体验,使用户能够轻松获取最新的或者更...

    安卓listview相关相关-一个简单的实现双listview共存demo.rar

    这个“安卓listview相关相关-一个简单的实现双listview共存demo”压缩包文件提供了实现两个ListView并排显示的示例,这对于构建复杂的用户界面,如显示不同类别的信息,或者在同一个屏幕中对比数据,非常有用。...

    Qt Qml ListView上拉加载数据 Demo源码

    这个Demo源码提供了一个完整的工程示例,用于展示如何在ListView中添加上拉加载功能,同时显示列表页脚的加载状态。 首先,Qt Qml是一种声明式编程语言,它使得构建用户界面变得更加直观和高效。ListView是Qml中最...

    android listview分页加载的demo【源代码】

    在Android开发中,ListView是广泛...以上就是关于“android listview分页加载的demo【源代码】”的详细知识点介绍,通过学习和实践,开发者可以掌握在Android应用中高效展示大量数据的技巧,提升应用的性能和用户体验。

    AndroidListView下拉刷新-Demo.zip

    这个"AndroidListView下拉刷新-Demo.zip"文件应该包含了一个示例项目,演示了如何在ListView中实现下拉刷新的功能。 首先,下拉刷新功能允许用户通过在ListView顶部向下拉动来更新列表内容,通常用于获取最新的数据...

    android--ListView下拉刷新demo

    `ListView`的下拉刷新功能是提升用户体验的重要特性,特别是在处理动态加载数据的应用场景中。这个“android--ListView下拉刷新demo”就是一个实例,旨在帮助新手理解并实现这一功能。 `ListView`的下拉刷新通常...

    ListView添加数据后动态刷新Demo

    本示例"ListView添加数据后动态刷新Demo"将向我们展示如何在ListView中动态加载和更新数据。动态刷新意味着当数据发生变化时,ListView能够实时反映出这些变化,而无需重新加载整个列表。 首先,我们来理解ListView...

    安卓listview相关相关-这是一个包含异步加载网络编程JSON解析LruCache图片缓存的简易的ListView图文混排Demo.rar

    【Android ListView详解与实践】 ...这个Demo为学习和理解Android ListView的综合使用提供了很好的实例,涵盖了从数据获取到UI展示的全过程。通过深入研究和实践,开发者能够掌握处理大数据列表和优化用户体验的技巧。

    Android listview实现图片的异步加载Demo.zip

    总之,"Android listview实现图片的异步加载Demo.zip"是一个很好的学习资源,它可以帮助开发者理解和实践Android中图片异步加载的关键技术,提高应用的性能和用户体验。通过深入研究和模仿这个Demo,开发者可以掌握...

    安卓listview相关相关-项目安卓万能适配器demo以及带刷新的XListView.zip

    本压缩包"安卓listview相关相关-项目安卓万能适配器demo以及带刷新的XListView.zip"提供了关于ListView使用的示例代码,包括万能适配器的实现和带有刷新功能的XListView。以下是对这些知识点的详细讲解: 1. **...

Global site tag (gtag.js) - Google Analytics