Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android GridView。滚动时避免反弹/碰撞_Java_Android_Gridview_Adapter_Bounce - Fatal编程技术网

Java Android GridView。滚动时避免反弹/碰撞

Java Android GridView。滚动时避免反弹/碰撞,java,android,gridview,adapter,bounce,Java,Android,Gridview,Adapter,Bounce,我的项目中有一个使用StaggedGridView()的GridView。 每个项目都由一个ImageView和一个TextView组成,不同ImageView的高度从一个更改为另一个 问题是当滚动回到顶部时,由于视图循环,当图像重新加载时,由于高度不同,StaggedEdgridView会有点“反弹”,这非常烦人 我正试图消除反弹,就像Pinterest或Etsy的应用程序一样(这些应用程序根本不会反弹,而且似乎会将纵横比保留在内存中)。我已经试过了,但我没有设法弄明白怎么做 下面是一些代码:

我的项目中有一个使用StaggedGridView()的GridView。 每个项目都由一个ImageView和一个TextView组成,不同ImageView的高度从一个更改为另一个

问题是当滚动回到顶部时,由于视图循环,当图像重新加载时,由于高度不同,StaggedEdgridView会有点“反弹”,这非常烦人

我正试图消除反弹,就像Pinterest或Etsy的应用程序一样(这些应用程序根本不会反弹,而且似乎会将纵横比保留在内存中)。我已经试过了,但我没有设法弄明白怎么做

下面是一些代码:

GridItemAdaptem

@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()
返回的
视图在执行
可运行的
之前呈现到屏幕上。当它这样做时,它会更新
视图
,您会看到视觉变化。通过去掉
可运行的
,您的
视图
在呈现到屏幕之前将具有正确的大小。

线程用于在加载时显示默认图像以及最终图像的高度。我已经删除了线程,问题仍然存在。事实上,这甚至是在实现线程之前。嗯……你确定最终图像大小与你之前计算的匹配吗?我会输出最终图像加载前后的视图大小。我猜你会看到大小不同,这解释了大小的视觉变化。嗯,我在实现整个代码时做了几次测试,因为这让我发疯(总体来说),无论如何,我会试试。非常感谢您的时间和回答;)