2015-09-07 408 views
1

我已經使用了RecyclerView和StaggeredGridLayoutManager。StaggeredGridLayoutManager錯位

當我從頂部滾動到底部時,它看起來不錯。但是當我從底部滾動到頂部時,頂部子視圖顯示爲空白。現在

,我發現當我從上往下滾動,它看起來:

left1  right1 
    left2  right2 
    left3  right3 
    left4  right4 
    left5  right5 
    left6  right6 
    left7  right7 

當我從底部到頂部滾動,發生了一件事,它看起來像這樣:

right1 left1 
    right2 left2 
    right3 left3 
    right4 left4 
    left5  right5 
    left6  right6 
    left7  right7 

左右的高度不同,所以在頂部時出現空白。

這裏是我的代碼:

recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
recyclerView.setItemAnimator(new DefaultItemAnimator()); 
staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(staggeredGridLayoutManager); 
recyclerView.setHasFixedSize(true); 
recyclerView.addItemDecoration(new ViewItemDecoration()); 

現在我不知道如何解決它。

這裏是我的適配器代碼:

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     int itemViewType = getItemViewType(position); 
     StaggeredGridLayoutManager.LayoutParams layoutParams1 = ((StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams()); 
     if (itemViewType < 0) { 
      return; 
     } 
     Logger.i("Topic_viewType", viewType.get(itemViewType) + ""); 
     switch (viewType.get(itemViewType)) { 
      case ITEM: 
       layoutParams1.setFullSpan(true); 
       onBindItemViewHolder(holder, position); 
       break; 
      case ITEMS: 
       layoutParams1.setFullSpan(true); 
       onBindItemsViewHolder(holder, position); 
       break; 
      case IMAGES: 
       layoutParams1.setFullSpan(true); 
       onBindImageViewHolder(holder, position); 
       break; 
      case BLANK: 
       layoutParams1.setFullSpan(true); 
       break; 
      case COVER: 
       layoutParams1.setFullSpan(true); 
       onBindCoverImageViewHolder(holder, position); 
       break; 
      case LINE: 
       layoutParams1.setFullSpan(true); 
       onBindLineViewHolder(holder, position); 
       break; 
      case TEXT: 
       layoutParams1.setFullSpan(true); 
       onBindTextViewHolder(holder, position); 
       break; 
      case SPACING: 
       layoutParams1.setFullSpan(true); 
       onBindSpacingViewHolder(holder, position); 
       break; 
      case READ_COUNT: 
       layoutParams1.setFullSpan(true); 
       onBindReadCountViewHolder(holder, position); 
       break; 
      case OTHER_TOPIC: 
       layoutParams1.setFullSpan(true); 
       break; 
      case HOT: 
       layoutParams1.setFullSpan(true); 
       onBindHotViewHolder(holder, position); 
       break; 
      case MORE: 
       layoutParams1.setFullSpan(true); 
       onBindMoreViewHolder(holder, position); 
       break; 
      case ITEMS_MORE: 
       layoutParams1.setFullSpan(true); 
       onBindItemsMoreViewHolder(holder, position); 
       break; 
      case WALL_ITEM_TITLE: 
       layoutParams1.setFullSpan(true); 
       break; 
      case WALL_ITEM: 
       layoutParams1.setFullSpan(false); 
       onBindWallItemViewHolder(holder, position); 
       break; 
      case WALL_LOAD_MORE: 
       layoutParams1.setFullSpan(true); 
       onBindLoadMoreViewHolder(holder, position); 
       break; 

     } 
    } 

這裏是我的bindHolder代碼:

String url = info.getImageSrc(); 
int width = info.getWidth(); 
int height = info.getHeight(); 
SimpleDraweeView imageView = viewHolder.image; 
imageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      UIHelper.jumpByUri(activity, info.getLink()); 
     } 
}); 
if (height > 0) { 
     // set the aspect ratio 
     imageView.setAspectRatio(width * 1.0f/height); 
} 
imageView.setImageURI(Uri.parse(url)); 

這裏是我的XML代碼:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:id="@+id/ll_topic_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include layout="@layout/toolbar_custom" /> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler_view" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    </LinearLayout> 

    <ImageView 
     android:id="@+id/iv_feedback" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/ic_feedback" 
     android:layout_alignParentRight="true" 
     android:layout_above="@+id/iv_back_top" 
     android:layout_marginBottom="@dimen/space_30px" 
     android:layout_marginRight="@dimen/space_30px" 
     android:adjustViewBounds="true" 
     android:contentDescription="@null" 
     android:visibility="gone"/> 

    <ImageView 
     android:id="@+id/iv_back_top" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginBottom="@dimen/space_30px" 
     android:layout_marginEnd="@dimen/space_30px" 
     android:layout_marginRight="@dimen/space_30px" 
     android:adjustViewBounds="true" 
     android:contentDescription="@null" 
     android:src="@drawable/up_top_icon" 
     android:visibility="gone" /> 

</RelativeLayout> 
+0

請分享您的佈局和適配器代碼。此外,不知道爲什麼你正在'recyclerView.setItemAnimator(新的DefaultItemAnimator());'後面加'recyclerView.setItemAnimator(null);'。遺忘的測試代碼? – yigit

+0

我要上傳我的代碼。我不知道什麼是錯的 –

+0

你有沒有設置尺寸的圖像視圖。我相信(你沒有分享設置它的代碼),你的綁定方法並沒有設置它。因此,當onBind被調用時,視圖將不會有最終維度,並且在加載圖像時會調整大小。因此,當它們被加載並且圖像被調整大小時,最初的交錯佈局可能不適合最後一個,導致另一個洗牌項目。相反,在服務器響應中傳遞圖像尺寸,以便您可以根據縱橫比來佈局圖像,以便在圖像準備好之前具有最終尺寸。 – yigit

回答

0

試試這個?

staggeredGridLayoutManager..setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS) 
+0

請*描述*這可能如何解決問題。僅發佈代碼通常完全沒有幫助。 –

+0

謝謝你,我試過了,但沒有成功 –