android ListView 滚动加载item

待我称王封你为后i 2023-10-16 19:36 99阅读 0赞



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

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

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

CenterCenter 1

相关布局文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. android:orientation="vertical" >
  5. <ListView
  6. android:id="@+id/listview_roll"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"
  9. android:layout_weight="1.0" />
  10. </LinearLayout>
  11. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"
  14. android:orientation="vertical" >
  15. <!-- 相关自定义控件 -->
  16. <TextView
  17. android:id="@+id/content"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content" >
  20. </TextView>
  21. </LinearLayout>

相关源代码:

  1. package com.activity.gdbk;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.activity.gdbk.PageActivity.PageAdapter;
  5. import com.activity.gdbk.PageActivity.ViewHolder;
  6. import com.gdbk.dao.Bank;
  7. import android.app.Activity;
  8. import android.app.ProgressDialog;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.view.Window;
  15. import android.view.WindowManager;
  16. import android.widget.AbsListView;
  17. import android.widget.AbsListView.OnScrollListener;
  18. import android.widget.BaseAdapter;
  19. import android.widget.ListView;
  20. import android.widget.TextView;
  21. //滚动ListView 加载相关数据信息
  22. public class RollActivity extends Activity implements Runnable {
  23. // 界面相关组件
  24. private ListView listView_roll;
  25. // 进度对话框
  26. private ProgressDialog progressDialog;
  27. // 自定义相关适配器
  28. private MyAdapter adapter;
  29. // ListView 数据常量定义
  30. private int LastItem = 0; // ListView 加载的最后item位置
  31. //MyAdapter 数据源
  32. List<Bank> banks = new ArrayList<Bank>();
  33. //创建RollActivity 界面的主线程
  34. private Handler handler=new Handler(){
  35. @Override
  36. public void handleMessage(Message msg) {
  37. // TODO Auto-generated method stub
  38. switch(msg.what){
  39. //进行相关数据加载.....
  40. case 1:
  41. progressDialog.dismiss();
  42. for (int i = listView_roll.getCount(); i < listView_roll.getCount() + 10; ++i) {
  43. Bank item=new Bank();
  44. item.setBank_name("湖南省光大银行**支行"+i);
  45. banks.add(item);
  46. }
  47. adapter.notifyDataSetChanged();
  48. //设置LastView 加载最后一项item的位置。
  49. listView_roll.setSelection(LastItem - 1);
  50. break;
  51. }
  52. }
  53. };
  54. @Override
  55. public void onCreate(Bundle savedInstanceState) {
  56. // TODO Auto-generated method stub
  57. super.onCreate(savedInstanceState);
  58. // 全屏显示
  59. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  60. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  61. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  62. setContentView(R.layout.activity_roll);
  63. // 相关组件的初始化方法
  64. listView_roll = (ListView) findViewById(R.id.listview_roll);
  65. initializeAdapter();
  66. listView_roll.setAdapter(adapter);
  67. // ListView 实现OnScrollListener接口
  68. listView_roll.setOnScrollListener(new OnScrollListener() {
  69. @Override
  70. public void onScroll(AbsListView view, int firstVisibleItem,
  71. int visibleItemCount, int totalItemCount) {
  72. // TODO Auto-generated method stub
  73. LastItem = firstVisibleItem + visibleItemCount;
  74. }
  75. @Override
  76. public void onScrollStateChanged(AbsListView view, int scrollState) {
  77. // TODO Auto-generated method stub
  78. if (LastItem == adapter.getCount()
  79. && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
  80. // 执行数据异步加载的相关方法。
  81. LoadItems();
  82. }
  83. }
  84. });
  85. }
  86. // 自定义相关方法
  87. // adapter初始化方法----initializeAdapter()
  88. public void initializeAdapter() {
  89. for (int i = 1; i <= 10; i++) {
  90. Bank items = new Bank();
  91. items.setBank_name("湖南省光大银行**支行");
  92. banks.add(items);
  93. }
  94. adapter = new MyAdapter(banks);
  95. }
  96. // 自定义适配器----myAdapter
  97. public class MyAdapter extends BaseAdapter {
  98. // myAdapter 相关参数
  99. private List<Bank> data;
  100. // MyAdapter 构造函数
  101. public MyAdapter(List<Bank> data) {
  102. this.data = data;
  103. }
  104. @Override
  105. public int getCount() {
  106. // TODO Auto-generated method stub
  107. return data.size();
  108. }
  109. @Override
  110. public Object getItem(int position) {
  111. // TODO Auto-generated method stub
  112. return data.get(position);
  113. }
  114. @Override
  115. public long getItemId(int position) {
  116. // TODO Auto-generated method stub
  117. return position;
  118. }
  119. @Override
  120. public View getView(int position, View convertView, ViewGroup parent) {
  121. // TODO Auto-generated method stub
  122. // 加载相关布局文件
  123. ViewHolder holder = null;
  124. if (convertView == null) {
  125. convertView = getLayoutInflater().inflate(
  126. R.layout.listview_page_item, parent, false);
  127. holder = new ViewHolder();
  128. // 初始化相关控件
  129. holder.content = (TextView) convertView
  130. .findViewById(R.id.content);
  131. convertView.setTag(holder);
  132. } else {
  133. holder = (ViewHolder) convertView.getTag();
  134. }
  135. // 设置数据源信息
  136. holder.content.setText(data.get(position).getBank_name());
  137. return convertView;
  138. }
  139. }
  140. // 自定义 布局文件类----ViewHolder
  141. public class ViewHolder {
  142. private TextView content;
  143. }
  144. // 实现继承Runnable 接口覆写相关方法
  145. @Override
  146. public void run() {
  147. // TODO Auto-generated method stub
  148. try {
  149. Thread.sleep(3000);
  150. handler.sendEmptyMessage(1);
  151. } catch (InterruptedException e) {
  152. e.printStackTrace();
  153. }
  154. }
  155. // 自定义相关方法-----异步加载相关数据信息方法
  156. public void LoadItems() {
  157. progressDialog = ProgressDialog.show(RollActivity.this, "温馨提示",
  158. "正在加载相关数据信息...", true);
  159. Thread t = new Thread(RollActivity.this);
  160. t.start();
  161. }
  162. }

发表评论

表情:
评论列表 (有 0 条评论,99人围观)

还没有评论,来说两句吧...

相关阅读

    相关 滚动

    由于网页的执行都是单线程的,在JS执行的过程中,页面会呈现阻塞状态。因此,如果JS处理的数据量过大,过程复杂,可能会造成页面的卡顿。传统的数据展现都以分页的形式,但是分页的效果