GridView分页加载-给GridView添FooterView
www.MyException.Cn 发布于:2013-04-09 16:45:09 浏览:35次
0
在项目开发中发现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