我有一个列表页,是采用GridView来实现的,初始数据是10个。当用户滑动到底部时,在去加载新的数据。
我在查看API时发现GridView有个addView方法,可以把一个子View添加到GridView里面去。但是该方法需要重写onDraw方法。网上收集了一些资料,整理下。
其实,动态的添加数据并不困难。首先,GridView在添加数据时,会使用到adapter,这个adapter继承自BaseAdapter.
在这个adapter的getView方法里面实现数据的加载。当有新数据时,只需要往原先的数据容器中添加数据,然后用adapter的notifyDataSetChanged方法,来告知adapter数据已经更新了,此时,adapter会自动往GridView里面添加数据。这样,网adapter里面动态添加数据的功能就实现了。
GridView实现分页,原理基本如上。但是要实现底部点击查看更多的按钮,则还需要一些改装。代码说明网上有很多,但是使用网上的demo有些问题。
添加一个“查看更多”按钮,采用的是在数据容器List中添加一个null值在最后,用来盛放footerview,这样,在GridView回滚的过程中,会出现空指针异常的错误。原因是在position小于List.size()-1的时候,convertview为footerview。很容易的就想到了解决这个问题的方法,就是在position不对应footerview时,将convertview置为空,重新创建convertview。
原文链接:https://github.com/hyhe/gridview-with-footerview
以下是getView中修改的代码:
public View getView(int pos, View convertView, ViewGroup parent) {
// System.out.println("############################");
// System.out.println("footerViewEnable"+footerViewEnable);
// Goods goods = mList.get(pos);
// System.out.println("pos=>"+pos+"\nmList.size()=>"+mList.size());
// System.out.println("mList=>"+mList);
// System.out.println("mList@pos=>"+goods);
// System.out.println("mList@pos=>"+mList.get(pos));
if(convertView != null && convertView.getClass().equals(FooterView.class) && pos != mList.size() - 1) {
convertView = null;
}
if(mList.get(pos) == null || pos == mList.size() - 1) {
if(footerView != null) {
return footerView;
}
footerView = new FooterView(ListActivity.this);
footerView.setLayoutParams(new GridView.LayoutParams(getDisplayWidth(), GridView.LayoutParams.WRAP_CONTENT));
footerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
footerView.setStatus(FooterView.LOADING);
mHandler.post(mRunnable);
}
});
return footerView;
}
ViewHolder viewHolder = null;
if(convertView == null) {
viewHolder = new ViewHolder();
convertView = (View) mInflater.inflate(R.layout.list_grid_item_view, null);
viewHolder.img = (ImageView) convertView.findViewById(R.id.list_grid_img);
viewHolder.txt = (TextView) convertView.findViewById(R.id.list_grid_text);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txt.setText(mList.get(pos).getGoodsName());
imageLoader.displayImage(mList.get(pos).getGoodsImage(), viewHolder.img, options);
return convertView;
}