我在我的項目中使用StaggeredGridView(https://github.com/etsy/AndroidStaggeredGrid)有一個GridView。 每個項目由一個ImageView和一個TextView組成,並且不同ImageView的高度從一個變爲另一個。Android GridView。滾動時避免反彈/顛簸
由於視圖回收,當圖像重新加載時,由於具有不同高度,StaggeredGridView「反彈」了一下,而且很煩人,所以當滾動回到頂端時,問題就出現了。
我試圖刪除反彈,就像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>
線程用於在加載時使用最終圖像的高度顯示默認圖像。 我已經刪除線程,問題仍然存在。事實上,甚至在實施線程之前。 – Viperey 2014-09-04 11:49:07
嗯...你是積極的最終圖像大小匹配你之前計算的東西嗎?在輸出最終圖像之前和之後,我會輸出視圖大小。我猜你會發現尺寸不同,這就解釋了尺寸的視覺變化。 – 2014-09-04 16:04:24
嗯,我在執行這整個代碼時做了幾個測試,因爲它讓我發瘋(整體而言) 無論如何,我會嘗試。 非常感謝您的時間和答案;) – Viperey 2014-09-05 09:10:55