我使用过RecyclerView和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 :(得分:0)
试试这个吗?
staggeredGridLayoutManager..setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS)
答案 1 :(得分:0)
StaggeredGridLayoutManager使用两种策略来处理差距。默认策略为GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS
,这意味着StaggeredGridLayoutManager可以重新排列项目。您可以使用GAP_HANDLING_NONE
来防止重新排列。例如:
recyclerView.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL).apply {
gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_NONE
}