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

来源:互联网 发布:建筑能耗模拟软件 编辑:程序博客网 时间:2024/05/18 00:34

实现效果:



实现代码:

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 stubinitView(context);}public LoadListView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView(context);}public LoadListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stubinitView(context);}private void initView(Context context) {// TODO Auto-generated method stubLayoutInflater 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);}@Overridepublic 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();}}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stubthis.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;@Overrideprotected 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 stubif (null == mAdapter) {getData();mListView = (LoadListView) findViewById(R.id.listview);mListView.setOnToBottomListener(new OnToBottomListener() {@Overridepublic void onLoad() {// TODO Auto-generated method stubnew Handler().postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubgetLoadData();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 stubthis.apkList = apkList;this.inflater = LayoutInflater.from(context);}public void onDateChange(ArrayList<ApkEntity> apkList) {this.apkList = apkList;this.notifyDataSetChanged();}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn apkList.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn apkList.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubApkEntity 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
原创粉丝点击