Listview优化——分页加载

来源:互联网 发布:文明5金币修改器 知乎 编辑:程序博客网 时间:2024/05/20 11:21

listview的优化方案,这也是面试中常考的题目。优化方案有三种:

1、如果是自定义适配器,那么在getView方法中判断contentView是否为空,如果为空,创建contentView并返回,如果不为空直接返回contentView。这样就能尽可能少创建view;

2、给contentView设置tag,传入一个viewHoder对象,用于缓存要实现的数据;

3、如果listview中显示的item太多,就要考虑分页加载了。


分页加载大致实现方法:

定义ListView的滚动监听,当滚动状态停止,且屏幕上显示的最后一个item为list中的最后一个,通过调用:notifyDataSetChanged 加载新的数据。


分页加载的详细步骤:

1、创建一个xml布局文件,内容大致为一个进度条和一行文字:正在加载...... ListView被拖到最后,进行分页加载前显示;

2、创建一个类:LoadListView,继承ListView;

3、在LoadListView类中,首先要定义 initview 方法,用于加载底部布局页面,然后设置ListView的滚动监听(实现OnScrollListener 接口,实现未实现的方法:onScroll、onScrollStateChanged)。并且在ListView的三个构造方法中都要调用initview 方法;

4、ListView的滚动监听,主要涉及两个方法:onScroll、onScrollStateChanged。onScroll是在ListView滚动时调用,onScrollStateChanged是在ListView滚动状态发生变化时调用。在onScroll方法中,得到屏幕显示的最后一个item(int 类型),和ListView总共的item个数。接着在onScrollStateChanged方法中判断,当滚动状态停止,并且显示的最后一条item为全部item的最后一个,显示底部加载页面,加载数据;

5、加载数据的方法通过接口完成:在LoadListView中定义一个接口:ILoadListener,定义一个方法:onLoad,用于加载数据;

6、显示ListView的Activity实现ILoadListener接口,并且实现onLoad方法,用于加载数据;

7、在LoadListView中定义一个方法LoadComplete,用于在加载完毕之后,隐藏底部页面。


LoadListView代码:

package com.imooc.view;import com.imooc.load.R;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.AbsListView;import android.widget.ListView;import android.widget.AbsListView.OnScrollListener;public class LoadListView2 extends ListView implements OnScrollListener {private View footer;// ListView中的list总数量private int totalItemCount;// ListView中最后一个listprivate int lastVisibleItem;private boolean isLoading;private ILoadListener iLoadListener;public LoadListView2(Context context) {super(context);// TODO Auto-generated constructor stubinitview(context);}public LoadListView2(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinitview(context);}public LoadListView2(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitview(context);}// 用于加载底部布局页面public void initview(Context context) {LayoutInflater inflater = LayoutInflater.from(context);footer = inflater.inflate(R.layout.footer_layout, null);// 起始状态为隐藏footer.findViewById(R.id.load_layout).setVisibility(View.GONE);this.addFooterView(footer);// 设置滚动监听this.setOnScrollListener(this);}// 加载数据完毕,isloading设为false,并且隐藏底部加载页面public void LoadComplete() {isLoading = false;footer.findViewById(R.id.load_layout).setVisibility(View.GONE);}// 滚动状态发生变化@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stub// 滚动状态停止,且最后一个item等于总共的item数量if (lastVisibleItem == totalItemCount && scrollState == SCROLL_STATE_IDLE) {if (!isLoading) {isLoading = true;// 1、显示底部布局footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);// 2、加载数据iLoadListener.onLoad();}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stubthis.lastVisibleItem = firstVisibleItem + visibleItemCount;this.totalItemCount = totalItemCount;}public void setInterface(ILoadListener iLoadlistener) {this.iLoadListener = iLoadlistener;}// 用于获得更多数据、更新ListView内容public interface ILoadListener {public void onLoad();}}


onLoad方法示例:
public void onLoad() {// TODO Auto-generated method stubHandler handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub// 加载数据getLoadData();// 更新ListViewshowListView(apk_list);// 加载完毕listview.LoadComplete();}}, 2000);}


0 0
原创粉丝点击