android ListView 滚动加载item分析

熊孩纸 阅读:237 2021-03-31 23:31:34 评论:0


悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容。通常来说,一个应用在展现大量数据时,不会将全部的可用数据都呈现给用户,因为这不管对于服务端还是客户端来说都是不小的压力,因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。比如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个“加载更多”按钮,用户点击后,加载下一页数据。

我们今天就结合实例来演示一下使用ListView获取数据的过程。

新建一个loadmore项目,我们来看一下结构图和最终效果图:



相关布局文件:

<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/listview_roll" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:layout_weight="1.0" /> 
 
</LinearLayout>

<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/content" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" > 
    </TextView> 
 
</LinearLayout>

相关源代码:

package com.activity.gdbk; 
 
import java.util.ArrayList; 
import java.util.List; 
 
import com.activity.gdbk.PageActivity.PageAdapter; 
import com.activity.gdbk.PageActivity.ViewHolder; 
import com.gdbk.dao.Bank; 
 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.AbsListView; 
import android.widget.AbsListView.OnScrollListener; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
 
//滚动ListView 加载相关数据信息 
public class RollActivity extends Activity implements Runnable { 
	// 界面相关组件 
	private ListView listView_roll; 
	// 进度对话框 
	private ProgressDialog progressDialog; 
	// 自定义相关适配器 
	private MyAdapter adapter; 
	// ListView 数据常量定义 
	private int LastItem = 0; // ListView 加载的最后item位置 
	//MyAdapter 数据源 
	List<Bank> banks = new ArrayList<Bank>(); 
	 
	//创建RollActivity 界面的主线程 
	private Handler handler=new Handler(){ 
 
		@Override 
		public void handleMessage(Message msg) { 
			// TODO Auto-generated method stub 
			switch(msg.what){ 
			//进行相关数据加载..... 
			case 1: 
				progressDialog.dismiss();   
				           for (int i = listView_roll.getCount(); i < listView_roll.getCount() + 10; ++i) {   
				        	   Bank item=new Bank(); 
				        	   item.setBank_name("湖南省光大银行**支行"+i); 
				        	   banks.add(item); 
				            }   
				             adapter.notifyDataSetChanged();   
				             //设置LastView  加载最后一项item的位置。 
				             listView_roll.setSelection(LastItem - 1);   
 
				 
				break; 
			 
			} 
		} 
		 
		 
	}; 
 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		// TODO Auto-generated method stub 
		super.onCreate(savedInstanceState); 
		// 全屏显示 
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
				WindowManager.LayoutParams.FLAG_FULLSCREEN); 
		this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
		setContentView(R.layout.activity_roll); 
 
		// 相关组件的初始化方法 
		listView_roll = (ListView) findViewById(R.id.listview_roll); 
		initializeAdapter(); 
		listView_roll.setAdapter(adapter); 
		// ListView 实现OnScrollListener接口 
		listView_roll.setOnScrollListener(new OnScrollListener() { 
 
			@Override 
			public void onScroll(AbsListView view, int firstVisibleItem, 
					int visibleItemCount, int totalItemCount) { 
				// TODO Auto-generated method stub 
				LastItem = firstVisibleItem + visibleItemCount; 
			} 
 
			@Override 
			public void onScrollStateChanged(AbsListView view, int scrollState) { 
				// TODO Auto-generated method stub 
				if (LastItem == adapter.getCount() 
						&& scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
					// 执行数据异步加载的相关方法。 
					LoadItems(); 
				} 
 
			} 
 
		}); 
	} 
 
	// 自定义相关方法 
	// adapter初始化方法----initializeAdapter() 
	public void initializeAdapter() { 
		 
		for (int i = 1; i <= 10; i++) { 
			Bank items = new Bank(); 
			items.setBank_name("湖南省光大银行**支行"); 
			banks.add(items); 
		} 
		adapter = new MyAdapter(banks); 
	} 
 
	// 自定义适配器----myAdapter 
	public class MyAdapter extends BaseAdapter { 
		// myAdapter 相关参数 
		private List<Bank> data; 
 
		// MyAdapter 构造函数 
		public MyAdapter(List<Bank> data) { 
			this.data = data; 
		} 
 
		@Override 
		public int getCount() { 
			// TODO Auto-generated method stub 
			return data.size(); 
		} 
 
		@Override 
		public Object getItem(int position) { 
			// TODO Auto-generated method stub 
			return data.get(position); 
		} 
 
		@Override 
		public long getItemId(int position) { 
			// TODO Auto-generated method stub 
			return position; 
		} 
 
		@Override 
		public View getView(int position, View convertView, ViewGroup parent) { 
			// TODO Auto-generated method stub 
			// 加载相关布局文件 
			ViewHolder holder = null; 
			if (convertView == null) { 
				convertView = getLayoutInflater().inflate( 
						R.layout.listview_page_item, parent, false); 
				holder = new ViewHolder(); 
				// 初始化相关控件 
				holder.content = (TextView) convertView 
						.findViewById(R.id.content); 
				convertView.setTag(holder); 
			} else { 
				holder = (ViewHolder) convertView.getTag(); 
			} 
			// 设置数据源信息 
			holder.content.setText(data.get(position).getBank_name()); 
 
			return convertView; 
		} 
 
	} 
 
	// 自定义 布局文件类----ViewHolder 
	public class ViewHolder { 
		private TextView content; 
	} 
 
	// 实现继承Runnable 接口覆写相关方法 
	@Override 
	public void run() { 
		// TODO Auto-generated method stub 
		try { 
			Thread.sleep(3000); 
			handler.sendEmptyMessage(1); 
		} catch (InterruptedException e) { 
			e.printStackTrace(); 
		} 
 
	} 
 
	// 自定义相关方法-----异步加载相关数据信息方法 
	public void LoadItems() { 
		progressDialog = ProgressDialog.show(RollActivity.this, "温馨提示", 
				"正在加载相关数据信息...", true); 
		Thread t = new Thread(RollActivity.this); 
		t.start(); 
	} 
 
}


声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号