根据它的位置缩放RecyclerView项目

时间:2016-04-12 08:00:22

标签: android user-interface android-recyclerview scale

我正在尝试实现如下的RecyclerView:

enter image description here

项目是相同类型但具有不同比例的视图。我试过打电话

view.setScaleX(scaleFactor);  view.setScaleY(scaleFactor);

在RecycleView适配器的OnBindViewHolder方法中以及在ItemDecorator中,但每次列表的行为都是意外的。 实现它的最佳方法是什么?可能与其他控件如PagerAdapter或其他。

UPD:缩放系数取决于适配器中项目的位置,滚动时不应更改。

UPD2:以下是我在OnBoundViewHolder中尝试过的代码:

int childCount = recyclerView.getChildCount();
View view = holder.getView();

if (position == childCount){
    view.setScaleX(1f);
    view.setScaleY(1f);
} else if (position == childCount - 1){
    view.setScaleX(0.8f);
    view.setScaleY(0.8f);
} else if (position == childCount - 2){
    view.setScaleX(0.6f);
    view.setScaleY(0.6f);
}
else {
    view.setScaleX(0.4f);
    view.setScaleY(0.4f);
}

这是结果(滚动时它会改变):

enter image description here

相同的代码,但在ItemDecorator getItemOffsets

enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于您根据相对于RecyclerView内子项数量

的位置来确定比例

请记住,回收者视图永远不会有比目前可见的更多的孩子(+一些额外的增量)。它不是指示您的回收商将显示多少项目的指标。例如,具有1000个项目的回收者将只有大约6-7的子计数,具体取决于每个列表项的大小。

您要做的是将位置与项目计数

进行比较

这是一个建议的修复:

int totalItems = getItemCount();
View view = holder.getView();

if (position == totalItems - 1){ // final position will equal total items - 1
    view.setScaleX(1f);
    view.setScaleY(1f);
} else if (position == totalItems - 2){
    view.setScaleX(0.8f);
    view.setScaleY(0.8f);
} else if (position == totalItems - 3){
    view.setScaleX(0.6f);
    view.setScaleY(0.6f);
}
else {
    view.setScaleX(0.4f);
    view.setScaleY(0.4f);
}

希望这有帮助。