ListView实现上拉加载更多的item(用到接口回调)

实现效果:



实现代码:

LoadListView.java

public class LoadListView extends ListView implements OnScrollListener {

	private View footer;
	private int lastItem;
	private int totalItemCount;
	private boolean isLoading;
	private OnToBottomListener mOnToBottomListener;

	public LoadListView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	public LoadListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	public LoadListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		initView(context);
	}

	private void initView(Context context) {
		// TODO Auto-generated method stub
		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);
	}

	/**
	 * 加载完毕
	 */
	public void loadComplete() {
		isLoading = false;
		footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// 当ListView滑到低端
		if (lastItem == totalItemCount && scrollState == SCROLL_STATE_IDLE) {
			if (!isLoading) {
				isLoading = true;
				footer.findViewById(R.id.load_layout).setVisibility(
						View.VISIBLE);
				mOnToBottomListener.onLoad();
			}
			
		}
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		this.lastItem = firstVisibleItem + visibleItemCount;
		this.totalItemCount = totalItemCount;
	}

	public void setOnToBottomListener(OnToBottomListener listener) {
		this.mOnToBottomListener = listener;
	}

	interface OnToBottomListener {
		void onLoad();
	}
}
上面的OnToBottomListener是定义的内部接口,用来和MainActivity通信

MainActivity.java

public class MainActivity extends Activity {
	private ArrayList<ApkEntity> mApkList;
	private LoadListView mListView;
	private MyAdapter mAdapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mApkList = new ArrayList<ApkEntity>();
		initListView();
	}
	
	/**
	 * 初始化ListView
	 */
	private void initListView() {
		// TODO Auto-generated method stub
		if (null == mAdapter) {
			getData();
			mListView = (LoadListView) findViewById(R.id.listview);
			mListView.setOnToBottomListener(new OnToBottomListener() {
				
				@Override
				public void onLoad() {
					// TODO Auto-generated method stub
					new Handler().postDelayed(new Runnable() {
						
						@Override
						public void run() {
							// TODO Auto-generated method stub
							getLoadData();
							initListView();
							mListView.loadComplete();
						}
					}, 5000);
				}
			});
			mAdapter = new MyAdapter(this, mApkList);
			mListView.setAdapter(mAdapter);
		}else{
			mAdapter.onDateChange(mApkList);
		}
	}
	
	/**
	 * 为ApkList添加内容
	 */
	private void getData(){
		for (int i = 0; i < 10; i++) {
			ApkEntity entity = new ApkEntity();
			entity.setName("测试程序");
			entity.setInfo("50w用户");
			entity.setDes("这是一个神奇的应用!");
			mApkList.add(entity);
		}
	}
	
	private void getLoadData(){
		for (int i = 0; i < 2; i++) {
			ApkEntity entity = new ApkEntity();
			entity.setName("新增程序");
			entity.setInfo("50w用户");
			entity.setDes("这是一个神奇的应用!");
			mApkList.add(entity);
		}
	}
}

MyAdapter.java

public class MyAdapter extends BaseAdapter {

	private LayoutInflater inflater;
	private ArrayList<ApkEntity> apkList;

	public MyAdapter(Context context, ArrayList<ApkEntity> apkList) {
		// TODO Auto-generated constructor stub
		this.apkList = apkList;
		this.inflater = LayoutInflater.from(context);
	}

	public void onDateChange(ArrayList<ApkEntity> apkList) {
		this.apkList = apkList;
		this.notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return apkList.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return apkList.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
		ApkEntity entity = apkList.get(position);
		ViewHolder holder;
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.item_layout, null);
			holder = new ViewHolder();
			holder.name_tv = (TextView) convertView
					.findViewById(R.id.item3_apkname);
			holder.des_tv = (TextView) convertView
					.findViewById(R.id.item3_apkdes);
			holder.info_tv = (TextView) convertView
					.findViewById(R.id.item3_apkinfo);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		holder.name_tv.setText(entity.getName());
		holder.des_tv.setText(entity.getDes());
		holder.info_tv.setText(entity.getInfo());
		return convertView;
	}

	class ViewHolder {
		TextView name_tv;
		TextView des_tv;
		TextView info_tv;
	}
}
MyAdapter继承自BaseAdapter,其中用到ViewHolder和convertView来提高性能,

至于ViewHolder的原理请参考 ListView之BaseAdapter的基本使用以及ViewHolder模式


ApkEntity.java

package com.example.loadlistview;

public class ApkEntity {
	private String name;
	private String des;
	private String info;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDes() {
		return des;
	}
	public void setDes(String des) {
		this.des = des;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值