2014-09-03 29 views
0

我在我的項目中使用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> 

回答

0

Runnable。只需在getView()調用中直接執行該代碼即可。

正如您的代碼所示,您正在UI線程上執行Runnable。這意味着在getView()方法中使用它也沒有任何好處......它也在UI線程上執行。您看到調整大小,因爲從getView()返回的View正在呈現到屏幕上,然後Runnable才能執行。當它發生時,它會更新View,您會看到視覺變化。通過擺脫Runnable,您的View將在呈現到屏幕之前處於正確的大小。

+0

線程用於在加載時使用最終圖像的高度顯示默認圖像。 我已經刪除線程,問題仍然存在。事實上,甚至在實施線程之前。 – Viperey 2014-09-04 11:49:07

+0

嗯...你是積極的最終圖像大小匹配你之前計算的東西嗎?在輸出最終圖像之前和之後,我會輸出視圖大小。我猜你會發現尺寸不同,這就解釋了尺寸的視覺變化。 – 2014-09-04 16:04:24

+0

嗯,我在執行這整個代碼時做了幾個測試,因爲它讓我發瘋(整體而言) 無論如何,我會嘗試。 非常感謝您的時間和答案;) – Viperey 2014-09-05 09:10:55