Java Android GridView。滚动时避免反弹/碰撞
我的项目中有一个使用StaggedGridView()的GridView。 每个项目都由一个ImageView和一个TextView组成,不同ImageView的高度从一个更改为另一个 问题是当滚动回到顶部时,由于视图循环,当图像重新加载时,由于高度不同,StaggedEdgridView会有点“反弹”,这非常烦人 我正试图消除反弹,就像Pinterest或Etsy的应用程序一样(这些应用程序根本不会反弹,而且似乎会将纵横比保留在内存中)。我已经试过了,但我没有设法弄明白怎么做 下面是一些代码: GridItemAdaptemJava Android GridView。滚动时避免反弹/碰撞,java,android,gridview,adapter,bounce,Java,Android,Gridview,Adapter,Bounce,我的项目中有一个使用StaggedGridView()的GridView。 每个项目都由一个ImageView和一个TextView组成,不同ImageView的高度从一个更改为另一个 问题是当滚动回到顶部时,由于视图循环,当图像重新加载时,由于高度不同,StaggedEdgridView会有点“反弹”,这非常烦人 我正试图消除反弹,就像Pinterest或Etsy的应用程序一样(这些应用程序根本不会反弹,而且似乎会将纵横比保留在内存中)。我已经试过了,但我没有设法弄明白怎么做 下面是一些代码:
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final Holder holder;
if( convertView!=null ){
holder = (Holder) convertView.getTag();
} else {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
convertView = inflater.inflate( R.layout._grid_guide_item, parent, false );
holder = new Holder( convertView );
convertView.setTag(holder);
}
final Guide guide = this.guides.get(position);
holder.pic.post(new Runnable() {
@Override
public void run() {
try {
int height = Integer.parseInt( guide.getCover().getHeight() ) * holder.pic.getWidth() / Integer.parseInt(guide.getCover().getWidth());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( holder.pic.getWidth(), height );
holder.pic.setScaleType(ImageView.ScaleType.FIT_XY);
holder.pic.setLayoutParams(params);
ImageAware imageAware = new ImageViewAware( holder.pic, true);
imageLoader.displayImage(
FavoAPI.getImageURL( guide.getCoverId() ),
imageAware
);
} catch (NotCoverException ignored) {}
}
} );
holder.name.setText( guide.getName() );
holder.user.setText( Finals.AUTHOR + guide.getOwner().getFull_name() );
return convertView;
}
static class Holder {
@InjectView( R.id._grid_item_user )
TextView user;
@InjectView( R.id._grid_item_name )
TextView name;
@InjectView( R.id._grid_item_pic)
RoundedCornerImageView pic;
public Holder( View view ){
ButterKnife.inject(this, view);
}
}
grid_item.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/GuidePreviewGuideCardItem"
>
<nl.favoThings.favoroute.Views.Widgets.RoundedCornerImageView
android:id="@+id/_grid_item_pic"
style="@style/gridItem_image"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/formDefault_tinnyMargin"
>
<TextView
android:id="@+id/_grid_item_name"
style="@style/gridItem_bigText"
/>
<TextView
android:id="@+id/_grid_item_user"
style="@style/gridItem_smallText"
android:layout_width="wrap_content"
/>
</LinearLayout>
</LinearLayout>
ImageView的样式
<style name="gridItem_image">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_margin">@dimen/gridItem_image_margin</item>
<item name="android:padding">@dimen/gridItem_image_margin</item>
<item name="android:background">@color/white</item>
<item name="android:scaleType">fitStart</item>
<item name="android:adjustViewBounds">true</item>
<item name="android:src">@drawable/default_route</item>
</style>
填补家长的空缺
包装内容
@尺寸/网格项目\图像\边距
@尺寸/网格项目\图像\边距
@颜色/白色
fitStart
真的
@可绘制/默认路径
丢弃可运行的。只需在getView()调用中直接执行该代码即可
在代码运行时,您正在UI线程上执行Runnable
。这意味着在getView()
方法中使用它不会带来任何好处,该方法也会在UI线程上执行。之所以会看到大小调整,是因为从getView()
返回的视图在执行可运行的
之前呈现到屏幕上。当它这样做时,它会更新视图
,您会看到视觉变化。通过去掉可运行的
,您的视图
在呈现到屏幕之前将具有正确的大小。线程用于在加载时显示默认图像以及最终图像的高度。我已经删除了线程,问题仍然存在。事实上,这甚至是在实现线程之前。嗯……你确定最终图像大小与你之前计算的匹配吗?我会输出最终图像加载前后的视图大小。我猜你会看到大小不同,这解释了大小的视觉变化。嗯,我在实现整个代码时做了几次测试,因为这让我发疯(总体来说),无论如何,我会试试。非常感谢您的时间和回答;)