项目不会在RecyclerView中绘制

时间:2017-11-26 04:30:36

标签: android view android-recyclerview viewgroup

我有一个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);
        }
    }

RecyclerView Item

此代码提供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 Item Empty

在上面的图片中,布局界限甚至不显示,只显示了recyclerView的外部布局。 (使用手机上的选项显示布局边界)。

当我这样做而不是自定义视图组时,我使用的是LinearLayout,但是相同的自定义视图不会发生这种情况。它每次都显示视图。我也可以看到它只进入onCreateViewHolder 3次。

我正在寻找解决此问题的任何线索或答案。

0 个答案:

没有答案