Android-gridview 如何分页加载

Android-gridview 如何分页加载

晚风撩人 发布于 2017-09-15 字数 161 浏览 1579 回复 6

如何实现像listview一样的分页加载,listview可以通过addfootview来增加那个底部的loading view,但是gridview没有addfootview这样的方法,大家有没有比较好的方法?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

归属感 2017-10-26 6 楼

你需要写一个adapter,到达一定数目就继续加载。
在底部插入一个view,内容是加载更多! 最后就是点击这个view就触发剩下的数据的加载啦!

你需要用到的函数有 gridviewadapter中的 getview

虐人心 2017-10-22 5 楼

昨天我也遇到这个问题,也在网上查找了很多资料,大概有两种方案,一种就是自定义GridView,就是extends它,或者extends RelativeLayout,然后自己实现它。网上能找出来的资料基本上都是这种。还有一种方案,用ListView来实现。假设你的GridView有3列,假如是三张ImageView吧,那你在自定义ListView的Item的时候,就得有3个ImageView。当然还得修改Adapter中的getCount方法,类似于这样:

 public int getCount() {
if (photos.size() % 3 == 0) {
return photos.size() / 3;
}
return photos.size() / 3 + 1;
}

然后getView也会有相应的修改,无非就是根据position来计算吧,这里给个公式:当前行的第一个ImageView的位置是position3,第二个ImageView是position3+1,第三个是position*3+2

然后为每个ImageView设置onClickListener监听,这个可以从自定义的Adapter的构造方法中传过来。因为要取得当前点击的某个ImageView的数据,所以给每个ImageView设置一个Tag对象,这里直接把当前的Photo设置给ImageView的Tag。这里,在onClick(View v)中,通过Photo photp = v.getTag()就可以取得当前所点击的ImageView的数据,也就可以向其它页面传数据了。
大概原理是这样,我这项目里面还有动态选中和批量删除功能。代码量比较大,就不贴了,有什么问题再问吧。我这里测试工程里面的效果如下所示,看看是不是你需要的。

瑾兮 2017-10-20 4 楼

下面是一段我写过的sample code,是一个小项目中的adapter的一部分,你可以参考下这个getView的思路来实现那个loading view。

public View getView(int pos, View convertView, ViewGroup parent)
{
Log.e(TAG, "[getView] Begin + This is position:" + pos);
final SongListActivity tempActivity = mParentActivity;
if (tempActivity == null)
{
return convertView;
}
if (mTrackListData == null)
{
return convertView;
}

WrapperSong curSong = null;
if (mTrackListData.size() > pos)
{
curSong = mTrackListData.get(pos);
}
else
{
if (mLoadingView == null)
{
mLoadingView = mInflater.inflate(R.layout.loading_item, null);
mLoadingView.setTag(FLAG_LOADING_ITEM);
}
mPrepareGettingMore = false;
mLoadingViewIsShown = true;
return mLoadingView;
}
return getViewWithPhoto(convertView, curSong, parent, pos);
}

// get list view with four text lines
View getViewWithPhoto(View convertView, WrapperSong curSong, ViewGroup parent, int pos)
{
if (curSong == null)
{
Log.e(TAG, "[getViewWithDescription] curSong cannot be null!");
return convertView;
}

ViewHolder holder;
if (convertView == null || !convertView.getTag().getClass().equals(ViewHolder.class))
{
Log.i(TAG, "convertView == null,Then inflate and new holder");
convertView = mInflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.listImageView = (ImageView) convertView.findViewById(R.id.ImageView);
holder.listTextView1 = (TextView) convertView.findViewById(R.id.TextView01);
holder.listTextView2 = (TextView) convertView.findViewById(R.id.TextView02);
holder.listTextView3 = (TextView) convertView.findViewById(R.id.TextView03);
convertView.setTag(holder);
}
else
{
Log.d(TAG, "convertView != null,Then get Holder");
holder = (ViewHolder) convertView.getTag();
}

Log.i(TAG, "convertView != null,Then SetValue");

if (holder != null && holder.listImageView != null)
{
holder.listImageView.setTag(new Integer(pos));

String name = curSong.getSongName();
holder.listTextView1.setText("[name]:" + name);
String artist = curSong.getSingerName();
holder.listTextView2.setText("[artist]:" + artist);
String desc = curSong.getSongDescription();
holder.listTextView3.setText("[description]:" + desc);
}

/*
* TODO:If need add cache , you can do something before add to
* decode The bitmap and decodePath will get from cache
*/
String songImageURL = curSong.getSongImage();
MBitmap item = mMemoryCacheBmp.pull(pos);
Bitmap bitmap = (item == null) ? null : item.getBitmap();
String decodePath = (item == null) ? null : item.getPath();
if (bitmap == null || bitmap.isRecycled()
|| (bitmap != null && !TextUtils.equals(decodePath, songImageURL)))
{
Log.d(TAG, "bitmap is null.then add to decode queue");
if (mDecoder != null)
{
Log.d(TAG, "pos:" + pos + ",songImageURL:" + songImageURL);
mDecoder.add(true, pos, songImageURL, pos, songImageURL);
}
else
{
Log.e(TAG, "[getViewWithDescription] mDecoder cannot be null!");
}
if (holder != null && holder.listImageView != null)
{
Log.e(TAG, "[getViewWithPhoto] Set Default Album Icon");
holder.listImageView.setImageBitmap(mDefaultBmp);
}
}
else
{
if (holder != null && holder.listImageView != null)
{
Log.e(TAG, "[getViewWithPhoto] Set Image From Cache");
holder.listImageView.setImageBitmap(bitmap);
}
}
Log.e(TAG, "[getView] end + This is position:" + pos);
return convertView;
}

灵芸 2017-10-15 3 楼

给GridView的adapter绑定你指定的数据,当到最后一项的时候就加入一个loading view,不知道这样能不能满足你的要求?

偏爱自由 2017-10-10 2 楼

用ListView实现,抽象一个可以类似GridView一样易用的Adapter:

1.覆盖getCount,重新计算行数。

2.覆盖getView, 自动添加一个父类的View作为container, 然后抽象一个getCustomView用于添加单个view。getCustomView方法由子类Adapter实现,这样开发起来就跟GridView一样,包括页脚和页头。

灵芸 2017-10-07 1 楼

我在项目中实现分页的思路和ldmsoft是差不多的。
1、首先在适配器中定义一个构造函数public GridAdapter(Context context, Button footer);点击这个button加载下一页数据。
2、在getView(int position, View convertView, ViewGroup parent)方法中判断分页按钮的位置,如果是数据(mContentList)到了最后一个则显示该分页按钮;这里留个疑问:到底是在mContentList.size还是mContentList.size+1显示,你自己去试。

if(position == mContentList.size() && mIsShowFooter)
{

Bitmap scalBmp = Bitmap.createScaledBitmap(mDefaultNextBmp, width, this.mImgH, false);
mFooter.setLayoutParams(new GridView.LayoutParams(width, imageView.getHeight()));
mFooter.setBackgroundDrawable(new BitmapDrawable(scalBmp));
mFooter.setGravity(Gravity.CENTER);

return this.mFooter;
}

3、第三在你需要调用的Activity内new Button(Context context),设置这个Button的一些你需要的属性,添加一个监听事件,点击加载下一页数据。