我已經使用了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>
請分享您的佈局和適配器代碼。此外,不知道爲什麼你正在'recyclerView.setItemAnimator(新的DefaultItemAnimator());'後面加'recyclerView.setItemAnimator(null);'。遺忘的測試代碼? – yigit
我要上傳我的代碼。我不知道什麼是錯的 –
你有沒有設置尺寸的圖像視圖。我相信(你沒有分享設置它的代碼),你的綁定方法並沒有設置它。因此,當onBind被調用時,視圖將不會有最終維度,並且在加載圖像時會調整大小。因此,當它們被加載並且圖像被調整大小時,最初的交錯佈局可能不適合最後一個,導致另一個洗牌項目。相反,在服務器響應中傳遞圖像尺寸,以便您可以根據縱橫比來佈局圖像,以便在圖像準備好之前具有最終尺寸。 – yigit