2014-09-03 3 views
0

StaggeredGridView (https://github.com/etsy/AndroidStaggeredGrid)를 사용하여 내 프로젝트에 GridView가 있습니다. 모든 항목은 ImageView와 TextView로 구성되며 서로 다른 ImageView의 높이가 서로 다릅니다.Android GridView. 스크롤하는 동안 바운스/범프 방지

높이가 다르기 때문에 이미지를 다시로드 할 때보기 재사용으로 인해 맨 위로 스크롤 할 때 문제가 발생합니다. StaggeredGridView는 약간 튀어 나와 매우 귀찮습니다.

저는 Pinterest 또는 Etsy의 앱처럼 바운싱을 제거하려고합니다. (바운스하지 않고 메모리에 가로 세로 비율을 유지하는 것처럼 보입니다.) 나는 그럭저럭 어떻게하는지 계산할 수 없었다. 이미지 뷰

<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에 대한

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> 

스타일 : 여기

몇 가지 코드입니다. 코드가 getView() 호출에서 바로 실행되도록하십시오.

코드가 실행되면 UI 스레드에서 해당 Runnable을 실행 중입니다. 의미는 당신이 getView() 메서드에서 그것을 사용하는 이점을 얻지 않는다 ... 또한 UI 스레드에서 실행됩니다. Runnable이 실행되기 전에 에서 반환 된 View이 화면에 렌더링되기 때문에 크기 조정을 볼 수 있습니다. 표시되면 View이 업데이트되고 시각적 변경 사항이 표시됩니다. Runnable을 제거하면 View이 화면에 표시되기 전에 올바른 크기가됩니다.

+0

스레드는로드되는 동안 최종 이미지의 높이로 기본 이미지를 표시 할 수 있습니다. 스레드를 제거했으며 문제가 여전히 있습니다. 증서에서, 그것은 실을 구현하기 이전이었습니다. – Viperey

+0

흠 ... 최종 이미지 크기가 이전에 계산 한 것과 일치하는지 확인 하시겠습니까? 최종 이미지가로드되기 전과 후에 View 크기를 출력합니다. 크기가 다른 것을 볼 수있을 것입니다. 크기의 시각적 변화를 설명합니다. –

+0

음, 전체 코드를 구현하는 동안 몇 가지 테스트를했는데, 그 이유는 나를 미치게 만들었 기 때문입니다 (일반적으로 전체) 어쨌든, 시도해 보겠습니다. 시간과 답변을 주셔서 대단히 감사합니다.) – Viperey

관련 문제