GridView分页加载--给GridView加FooterView

在项目开发中发现gridview不像listview一样可以加个footerview来显示加载状态。为达到像listview一样的加载效果,可以给gridview伪造一个footerview.核心思想是在绑定的list末加个null值,在getview的时候判断当前adapter是否要加footerview.

1、初始化GridView.在GridView滑到底时加载数据

	private void initGridView() {
		adapter = new ItemAdapter(MainActivity.this, list);
		adapter.setOnFooterViewClickListener(MainActivity.this);
		gridview.setAdapter(adapter);
		gridview.setOnScrollListener(new OnScrollListener() {

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {

				if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
					if (view.getLastVisiblePosition() == (view.getCount() - 1)
							&& !isLoadFinished
							&& adapter.getFooterView().getStatus() != FooterView.LOADING) {
						loadMoreData();

					}
				}

			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {

			}
		});
	}

 2、分页加载完数据处理

	@Override
	public void onCompletedSucceed(List<String> l) {

		// 在添加数据之前删除最后的伪造item
		if (adapter.isFooterViewEnable()) {
			list.remove(list.get(list.size() - 1));
		}

		// 分页加载
		if (l.size() < PAGE_SIZE || list.size() + l.size() == COUNT) {
			// 如果加载出来的数目小于指定条数,可视为已全部加载完成
			isLoadFinished = true;
			list.addAll(l);
			adapter.setFootreViewEnable(false);
			adapter.notifyDataSetChanged();
		} else {
			// 还有数据可加载。
			list.addAll(l);
			// 伪造一个空项来构造一个footerview;
			list.add(null);
			adapter.setFootreViewEnable(true);
			adapter.notifyDataSetChanged();
		}

	}

 3、adapter中的处理

public class ItemAdapter extends BaseAdapter {

	private List<String> mList = new ArrayList<String>();
	private Context mContext;

	private FooterView footerView;

	private boolean footerViewEnable = false; 
	private OnClickListener ml;

	public ItemAdapter(Context context, List<String> list) {
		if (list != null) {
			this.mList = list;
		}
		this.mContext = context;

	}

	public boolean isFooterViewEnable() {
		return footerViewEnable;
	}

	/**
	 * 存放列表项控件句柄
	 */
	public static class ViewHolder {

		public TextView itemview;

	}

	public void setFootreViewEnable(boolean enable) {
		footerViewEnable = enable;
	}

	public void setOnFooterViewClickListener(OnClickListener l) {
		ml = l;
	}

	private int getDisplayWidth(Activity activity) {
		Display display = activity.getWindowManager().getDefaultDisplay();
		int width = display.getWidth();
		return width;
	}

	@Override
	public View getView(final int i, View convertView, ViewGroup parent) {
		// footerViewEnable 判断当前是否要加footerview
		if (footerViewEnable && i == mList.size() - 1) {
			if (footerView == null) {
				footerView = new FooterView(parent.getContext());
				// 若 gridview是多列的,footerview的宽度要设置成固定数值,不能是fill_parent
				GridView.LayoutParams pl = new GridView.LayoutParams(
						getDisplayWidth((Activity) mContext),
						LayoutParams.WRAP_CONTENT);
				footerView.setLayoutParams(pl);
				footerView.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {
						if (ml != null) {
							ml.onClick(v);
						}

					}
				});
			}
			setFooterViewStatus(FooterView.MORE);
			return footerView;
		}

		final ViewHolder holder;
		// 当convertView是footerView时要重新加载view.
		if (convertView == null
				|| (convertView != null && convertView == footerView)) {

			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.textview, parent, false);
			holder = new ViewHolder();
			holder.itemview = (TextView) convertView
					.findViewById(R.id.textview);

			convertView.setTag(holder);

		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.itemview.setText("item" + mList.get(i));
		return convertView;
	}

	public FooterView getFooterView() {
		return footerView;
	}

	public void setFooterViewStatus(int status) {
		if (footerView != null) {
			footerView.setStatus(status);
		}
	}

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

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

}

 完整demo地址:https://github.com/hyhe/gridview-with-footerview.git

猜你喜欢

转载自wo9shihhy.iteye.com/blog/1840996
今日推荐