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

ListView 动态加载

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

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

MainActivity.java
Java代码  收藏代码

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代码  收藏代码
 
 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的动态加载,以及分页显示来说以及够了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics