本文共 6525 字,大约阅读时间需要 21 分钟。
在Android中如果要做到大数据分页加载则需要我们的Activity实现OnScrollListener滚动条监听接口。当如果要做的更加高大上。比如需要在用户滑动至列表的底部,触碰摸个区域,则需要实现OnTouchListener接口,等等。
这里先讲加载大数据
首先需要在main.xml申明一个ListView,存放数据
由于ListView试图组件中,需要封装每一个item,所以需要layout中申明:
list_item.xml
在加上我们的效果时,当滑动至列表的底部也就是应用程序窗体底部时,想要加载下一行,所以需要一个按钮来触发 load_more.xml
在使用BaseAdapter适配器加载大量数据
package com.lol.huixin.adapter;import java.util.List;import java.util.Map;import com.lol.huixin.loaddatamore.R;import com.lol.huixin.views.ViewHolder;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class ListViewAdapter extends BaseAdapter { private ListMainActivity.java中调用
package com.lol.huixin.loaddatamore;import android.os.Bundle;import android.os.Handler;import android.util.Log;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.lol.huixin.adapter.ListViewAdapter;import android.app.ListActivity;import android.view.Menu;import android.view.View;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.Button;import android.widget.ListView;//由于我们这里模拟加载大量数据的样本,所以就需要有个滚动条,所以需要实现滚动条的接口public class MainActivity extends ListActivity implements OnScrollListener{ private ListView listView; private int visibleLastIndex = 0; //最后的可视项索引 private int visibleItemCount; // 当前窗口可见项总数 private ListViewAdapter adapter; //数据适配器 private View loadMoreView; private Button loadMoreButton; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //相当于实例化一个Layout,并在这个实例化的Layout中加一个按钮 loadMoreView = getLayoutInflater().inflate(R.layout.load_more, null); loadMoreButton = (Button) loadMoreView.findViewById(R.id.loadMoreButton); listView = getListView(); //获取id是list的ListView listView.addFooterView(loadMoreView); //设置列表底部视图 //初始化数据 initAdapter(); setListAdapter(adapter); //自动为id是list的ListView设置适配器 listView.setOnScrollListener(this); //添加滑动监听 } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /** * 初始化适配器 */ private void initAdapter() { List这个时候我们注意到了一个奇怪的现象:ViewHolder类> listMap=new ArrayList >(); for (int i = 0; i < 10; i++) { Map map=new HashMap (); map.put("bianhao",String.valueOf(i+1)); listMap.add(map); } adapter = new ListViewAdapter(this, listMap); } /** * 滑动状态改变时被调用 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { int itemsLastIndex = adapter.getCount() - 1; //数据集最后一项的索引 int lastIndex = itemsLastIndex + 1; //加上底部的loadMoreView项 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == lastIndex) { //如果是自动加载,可以在这里放置异步加载数据的代码 Log.i("LOADMORE", "loading..."); } } /** * 滑动时被调用 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { this.visibleItemCount = visibleItemCount; visibleLastIndex = firstVisibleItem + visibleItemCount - 1; } /** * 点击按钮事件 * @param view */ public void loadMore(View view) { loadMoreButton.setText("loading..."); //设置按钮文字loading handler.postDelayed(new Runnable() { @Override public void run() { loadData(); adapter.notifyDataSetChanged(); //数据集变化后,通知adapter listView.setSelection(visibleLastIndex - visibleItemCount + 1); //设置选中项 loadMoreButton.setText("load more"); //恢复按钮文字 } }, 2000); } /** * 模拟加载数据 */ private void loadData() { int count = adapter.getCount(); for (int i = count; i < count + 10; i++) { Map map=new HashMap (); map.put("bianhao",String.valueOf(i+1)); adapter.addItem(map); } } }
package com.lol.huixin.views;import java.io.Serializable;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;@SuppressWarnings("serial")public class ViewHolder implements Serializable{ public ImageView img; //public TextView title; public TextView list_item_text; public TextView info; public Button viewBtn;}项目结构:
运行效果:也是ok的。
然后我就在想为什么这样写了?
1.首先ListViewAdapter中有一个有参构造方法,我们在MainActivity调用时传入了两个参数,参数一是需要装载值ListView中的数据,参数二是当前上下文对象Context,
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
从当前layout的上下文作用域中得到SystemService中的LAYOUT_INFLATER_SERVICE东东,那么LAYOUT_INFLATER_SERVICE是什么东东,Android官网给与了解释:
Use with to retrieve a
for inflating layout resources in this context.