gpt4 book ai didi

java - 回收自定义扩展 GridView 中的 View ?

转载 作者:行者123 更新时间:2023-12-01 14:21:28 26 4
gpt4 key购买 nike

对于我的应用程序,我使用 library它在整个布局中实现了自己的 ScrollView。

我的问题是我需要在 fragment 中有一个 GridView,但这样做会导致大部分内容被砍掉,如下所示: Why You No Work?!(忽略顶部的 slider )

我最终创建了自己的 GridView,它根据行数扩展,但禁用 View 回收。由于我们使用大量图像,因此如果加载超过 10 个图像,我们最终会遇到各种 OutOfMemoryExceptions。我们也无法使用滚动时看到的动画等。

这是我的自定义 GridView 的代码:

public class PkGridView extends GridView implements OnTouchListener, OnScrollListener
{

private int listViewTouchAction;
private static final int MAXIMUM_LIST_ITEMS_VIEWABLE = 50;

public PkGridView(Context context, AttributeSet attrs)
{
super(context, attrs);
listViewTouchAction = -1;
setOnScrollListener(this);
setOnTouchListener(this);
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE)
{
if (listViewTouchAction == MotionEvent.ACTION_MOVE)
{
scrollBy(0, -1);
}
}
}

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int newHeight = 0;
final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (heightMode != MeasureSpec.EXACTLY)
{
ListAdapter listAdapter = getAdapter();
if (listAdapter != null && !listAdapter.isEmpty())
{
int listPosition = 0;
for (listPosition = 0; listPosition < listAdapter.getCount() && listPosition < MAXIMUM_LIST_ITEMS_VIEWABLE; listPosition++)
{
View listItem = listAdapter.getView(listPosition, null, this);
// now it will not throw a NPE if listItem is a ViewGroup instance
if (listItem instanceof ViewGroup)
{
listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
listItem.measure(widthMeasureSpec, heightMeasureSpec);
newHeight += listItem.getMeasuredHeight();
}
//newHeight += 5 * listPosition;
}
if ((heightMode == MeasureSpec.AT_MOST) && (newHeight > heightSize))
{
if (newHeight > heightSize)
{
newHeight = heightSize;
}
}
}
else
{
newHeight = getMeasuredHeight();
}
setMeasuredDimension(getMeasuredWidth(), newHeight);
}

@Override
public boolean onTouch(View v, MotionEvent event)
{
if (getAdapter() != null && getAdapter().getCount() > MAXIMUM_LIST_ITEMS_VIEWABLE)
{
if (listViewTouchAction == MotionEvent.ACTION_MOVE)
{
scrollBy(0, 1);
}
}
return false;
}
}

有什么办法可以让我的项目再次回收,同时仍然能够看到整个 GridView 而无需扩展?

最佳答案

您绝对应该使用自己的适配器实现。有一个针对 Android 开发人员的很好的培训,提供了在 ListView/GridView 中显示位图并执行所有异步图像加载和 View 回收的完整解决方案:

http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

在 getView(...) 中的自定义适配器中,您只需相应地使用 ViewHolder 模式,然后调用 loadBitmap(...) 即可完成。请参阅本教程以创建自定义适配器:

http://www.vogella.com/articles/AndroidListView/article.html#adapterown_custom

对于自定义 View ,也许这个也很有趣:

http://developer.android.com/training/custom-views/index.html

关于java - 回收自定义扩展 GridView 中的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com