我有一个RecyclerView,它使用ViewGroup作为其子布局。
RecyclerView:
@Override
public TileDetailsHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.weather_tile_details_c, parent, Constant.SHOULD_ATTACH_NOW);
return new TileDetailsHolder(view);
}
@Override
public void onBindViewHolder(TileDetailsHolder holder, int position)
{
holder.setSavedPosition(tileList.get(position).getSavedPosition());
position);
holder.setDetailsRowList(tileList.get(position).getDetailRows());
}
XML:
<views.WeatherDetailLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/weatherDetailsLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<views.WeatherDetailHeaderView
android:id="@+id/weatherDetailsHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<views.WeatherDetailDaysView
android:id="@+id/weatherDetailDays"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.v7.widget.RecyclerView
android:id="@+id/detailInnerRV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_green_light"/>
</views.WeatherDetailLayout>
ViewGroup:
public class WeatherDetailLayout extends ViewGroup
{
private int width;
private int height;
private int leftPos = 0;
private int rightPos = 0;
private int topPos = 0;
private int[] bottomPos = new int[3]; //3 = number of views
public WeatherDetailLayout(Context context) { super(context); init(); }
public WeatherDetailLayout(Context context, @Nullable AttributeSet attrs)
{ super(context, attrs); init(); }
public void init()
{
width = (int) Util.getScreenWidthInPixels();
height = (int) Util.getScreenHeightInPixelsNoToolbarOrStatusbar();
rightPos = width;
bottomPos[0] = (int) (height * 0.40);
bottomPos[1] = (int) (height * 0.20);
bottomPos[2] = (int) (height * 0.40);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
for(int i = 0; i < bottomPos.length; i++)
{
getChildAt(i).layout(leftPos, topPos, rightPos, topPos + bottomPos[i]);
topPos += bottomPos[i];
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
}
private int measureWidth(int measureSpec)
{
return resolveSizeAndState(width, measureSpec, 0);
}
private int measureHeight(int measureSpec)
{
return resolveSizeAndState(height, measureSpec, 0);
}
}
此代码提供3个视图,这些视图位于ViewGroup内部,与屏幕的宽度基本相同 第一个高度的40%,第二个高度的20个,第三个高度的40个。
RecyclerView使用水平布局管理器进行设置。一次只能看到一个项目。然后,用户可以向左或向右滚动一定数量的项目,例如10.当用户滚动时,最左侧或最右侧的项目被移除,并且根据用户滚动/滑动的方式添加新的项目。 / p>
1 2 3 4 5 6 7 8 9 10
用户从5开始,滚动到6,删除4,添加7。
第一个N(本例中通常为3个)项目被绘制得很好。当RecyclerView使用onCreateViewHolder时的含义。但是,当RecyclerView开始回收视图并使用onBindViewHolder时,不再显示任何内容。使用日志语句我可以看到它进入ViewGroup并继续onLayout和onMeasure。一切都得到计算,childGetCount方法返回3个视图,但没有显示任何内容。简单地了解活动的背景。
在上面的图片中,布局界限甚至不显示,只显示了recyclerView的外部布局。 (使用手机上的选项显示布局边界)。
当我这样做而不是自定义视图组时,我使用的是LinearLayout,但是相同的自定义视图不会发生这种情况。它每次都显示视图。我也可以看到它只进入onCreateViewHolder 3次。
我正在寻找解决此问题的任何线索或答案。