在项目开发中发现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
相关推荐
8. 示例代码库:`gridview-with-footerview-master`可能是一个示例项目,包含了实现此功能的具体代码。分析这个项目可以帮助你理解如何将上述理论知识应用到实际开发中。 总的来说,实现“加载更多”功能需要对...
2. "gridview-with-footerview-master":这个名字暗示了在GridView中添加了一个Footer视图来实现加载更多的功能。Footer视图通常会显示一个加载指示器或提示信息,告知用户数据正在加载。 3. "PullToRefreshView":...
10. **分页加载**:当数据集过大时,可以实现无限滚动或者分页加载,只有当用户滚动到列表底部时才加载更多数据。 11. **图片加载优化**:对于包含图片的项,可以使用库如Glide或Picasso进行高效图片加载和缓存管理...
7. **动态加载数据**:对于大量数据,可以使用分页加载策略,当用户滚动到底部时,通过网络或本地数据源加载更多数据。 8. **性能优化**:为提高性能,应复用convertView,避免每次创建新视图。同时,可以使用...
3. 数据分页加载:避免一次性加载大量数据,使用懒加载策略。 4. 使用AsyncTask或Loader进行后台数据加载,防止UI线程阻塞。 五、ListView的扩展 1. AbsListView:ListView的父类,增加了许多便利功能,如选择模式...
9. **分页加载**: - 在大型数据集的情况下,可以使用FooterView显示加载更多提示,并在用户滚动到底部时动态加载更多数据。 10. **性能优化**: - 避免在getView()中执行耗时操作,如网络请求或复杂的布局计算。...
7. **ListView的分页加载**:在数据量大的情况下,使用OnScrollListener监听滚动事件,实现懒加载策略,只在用户滚动到列表底部时加载更多数据,可以提高应用的响应速度。 8. **Smooth Scrolling**:为了提供更好的...
LoadMoreListView或者FooterView可以用来实现上拉加载更多,当用户滚动到列表底部时加载更多数据。 为了进一步优化ListView的性能,可以使用ViewHolder设计模式。ViewHolder持有ListView项视图的引用,避免了每次...