android ListView 数据分页加载分析

无情 阅读:219 2021-03-31 23:31:40 评论:0

  Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。

           下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多...”按钮来加载新闻(模拟新闻客户端)分页数据。同时限定每次加载10条记录,但完全加载完数据后,就把ListView列表底部视图“查看更多...”删除。假设加载的数据总数为 40 条记录。先看下该Demo工程的程序结构图:




相关布局文件

ListView布局文件

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

加载数据布局页面

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <Button   
      android:id="@+id/loadMoreButton"   
      android:layout_width="fill_parent"   
      android:layout_height="wrap_content" 
      android:text="查看更多..." />  
</LinearLayout>


ListView ----item布局文件

<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>



ListView 分页源代码-----可以直接运用于项目之中。

package com.activity.gdbk; 
 
import java.util.ArrayList; 
import java.util.List; 
import com.gdbk.dao.Bank; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.view.View.OnClickListener; 
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.Button; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
 
//Android ListViw 数据分页 
public class PageActivity extends Activity implements OnScrollListener { 
	// 相关定义控件 
	private ListView listview_page; 
	// 数据加载控件 
	private View loadMoreView; 
	private Button loadMoreButton; 
	private Handler handler = new Handler(); 
	// ListView 适配器 
	private PageAdapter adapter; 
 
	// ListView 相关分页参数设置 
	private int datasize = 40; // 模拟数据总条数 
	private int visibleLastIndex = 0;// 最后的可视项索引 
	private int visibleItemCount; // 当前窗口可见项总数 
 
	@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_page); 
 
		loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null); 
		loadMoreButton = (Button) loadMoreView 
				.findViewById(R.id.loadMoreButton); 
		loadMoreButton.setOnClickListener(new OnClickListener() { 
 
			@Override 
			public void onClick(View v) { 
				// TODO Auto-generated method stub 
				loadMoreButton.setText("正在加载中..."); // 设置按钮文字 
				handler.postDelayed(new Runnable() { 
 
					@Override 
					public void run() { 
						loadMoreData(); 
						adapter.notifyDataSetChanged(); 
						loadMoreButton.setText("查看更多..."); // 恢复按钮文字 
					} 
				}, 2000); 
 
			} 
 
		}); 
 
		listview_page = (ListView) findViewById(R.id.listview_page); 
		listview_page.addFooterView(loadMoreView); // 设置列表底部视图 
		initializeAdapter(); 
		listview_page.setAdapter(adapter); 
		listview_page.setOnScrollListener(this); 
 
	} 
 
	// adapter初始化方法----initializeAdapter() 
	public void initializeAdapter() { 
		List<Bank> banks = new ArrayList<Bank>(); 
		for (int i = 1; i <= 10; i++) { 
			Bank items = new Bank(); 
			items.setBank_name("湖南省光大银行**支行"); 
			banks.add(items); 
		} 
		adapter = new PageAdapter(banks); 
	} 
 
	// 分页加载相关数据信息 
	public void loadMoreData() { 
		int count = adapter.getCount(); 
 
		if (count + 10 <= datasize) { 
			for (int i = count + 1; i <= count + 10; i++) { 
				Bank item = new Bank(); 
				item.setBank_name("湖南省光大银行**支行"); 
				adapter.addNewsItem(item); 
			} 
		} else { 
			for (int i = count + 1; i <= datasize; i++) { 
				Bank item = new Bank(); 
				item.setBank_name("湖南省光大银行**支行"); 
				adapter.addNewsItem(item); 
			} 
		} 
 
	} 
 
	// 自定义相关适配器 
	public class PageAdapter extends BaseAdapter { 
		// PageAdapter 相关参数 
		private List<Bank> data; 
 
		// PageAdapter 构造函数 
		public PageAdapter(List<Bank> data) { 
			super(); 
			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; 
		} 
 
		// 自定义相关方法 
		/** 
		 * 添加数据列表项 
		 *  
		 * @param bankitem 
		 */ 
		public void addNewsItem(Bank bankitem) { 
			data.add(bankitem); 
		} 
 
	} 
 
	// 自定义ListView---布局文件类 
	public class ViewHolder { 
		private TextView content; 
	} 
 
	// 实现OnScrollListener接口---需要覆写的相关方法 
	@Override 
	public void onScroll(AbsListView view, int firstVisibleItem, 
			int visibleItemCount, int totalItemCount) { 
		// TODO Auto-generated method stub 
		this.visibleItemCount = visibleItemCount; 
		visibleLastIndex = firstVisibleItem + visibleItemCount - 1; 
		// 如果所有的记录选项等于数据集的条数,则移除列表底部视图 
		if (totalItemCount == datasize + 1) { 
			listview_page.removeFooterView(loadMoreView); 
			Toast.makeText(this, "数据全部加载完!", Toast.LENGTH_LONG).show(); 
		} 
 
	} 
 
	@Override 
	public void onScrollStateChanged(AbsListView view, int scrollState) { 
		int itemsLastIndex = adapter.getCount() - 1; // 数据集最后一项的索引 
		int lastIndex = itemsLastIndex + 1; 
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE 
				&& visibleLastIndex == lastIndex) { 
			// 如果是自动加载,可以在这里放置异步加载数据的代码 
		} 
 
	} 
 
}

效果展示:




声明

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

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号