Нет предварительного просмотра при использовании пользовательской реализации android.support.v7.widget.RecyclerView - PullRequest
0 голосов
/ 15 января 2019

Если я включу RecyclerView в свои макеты с атрибутом tools:listitem, я получу правильный предварительный просмотр в Android Studio.

Как только я включаю производное RecyclerView (пример ниже), я больше не получаю предварительный просмотр. Я попытался отключить весь пользовательский код, чтобы пользовательская реализация просто выполняла роль оболочки для RecyclerView из библиотеки поддержки, и даже в этом случае предварительный просмотр недоступен.

Есть ли способ заставить предварительный просмотр работать для этой пользовательской RecyclerView реализации?

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;

import com.sandbox.myapp.R;

/**
 * Custom implementation of the {@link RecyclerView}, which allows us to change the scrollbar
 * color at runtime.
 */
public final class CustomRecyclerView extends RecyclerView {

    private int scrollBarColor;

    public CustomRecyclerView(Context context) {
        super(context);
        scrollBarColor = ContextCompat.getColor(context, R.color.blue);
    }

    public CustomRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        scrollBarColor = ContextCompat.getColor(context, R.color.blue);
    }

    public CustomRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        scrollBarColor = ContextCompat.getColor(context, R.color.blue);
    }

    public void setScrollBarColor(@ColorInt int scrollBarColor) {
        this.scrollBarColor = scrollBarColor;
    }

    /**
     * Called by Android {@link android.view.View#onDrawScrollBars(Canvas)}
     */
    @SuppressWarnings("unused")
    protected void onDrawHorizontalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b) {
        scrollBar.setColorFilter(scrollBarColor, PorterDuff.Mode.SRC_ATOP);
        scrollBar.setBounds(l, t, r, b);
        scrollBar.draw(canvas);
    }

    /**
     * Called by Android {@link android.view.View#onDrawScrollBars(Canvas)}
     */
    @SuppressWarnings("unused")
    protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b) {
        scrollBar.setColorFilter(scrollBarColor, PorterDuff.Mode.SRC_ATOP);
        scrollBar.setBounds(l, t, r, b);
        scrollBar.draw(canvas);
    }
}

Файл макета активности:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dark_grey"
    android:orientation="vertical">

    <include layout="@layout/layout_top_bar" />

    <com.sandbox.myapp.custom.views.CustomNestedScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/ok_button"
        android:layout_below="@id/top_bar"
        android:layout_margin="@dimen/question_margin"
        android:scrollbars="vertical">

        <RelativeLayout
            android:id="@+id/scrollViewContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <include layout="@layout/question"/>

            <com.sandbox.myapp.custom.views.CustomRecyclerView
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/recyclerView"
                android:scrollbars="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/questionTextView"
                tools:itemCount="5"
                tools:listitem="@layout/row_hyperlink"/>

            <include layout="@layout/question_error"
                android:layout_below="@id/recyclerView"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content" />

        </RelativeLayout>

    </com.sandbox.myapp.custom.views.CustomNestedScrollView>

    <include layout="@layout/ok_button"/>

</RelativeLayout>

Макет элемента Recyclerview:

<?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="wrap_content"
    android:layout_marginBottom="@dimen/view_distance"
    android:layout_marginTop="@dimen/view_distance"
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/shareIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="@drawable/url_browser" />

    <com.sandbox.myapp.custom.views.CustomTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_toRightOf="@id/shareIcon"
        android:textColor="@color/defaultTheme"
        android:text="Hyperlink"/>

</RelativeLayout>

1 Ответ

0 голосов
/ 16 января 2019

Попробуйте это:

public CustomRecyclerView(Context context) {
        super(context);
    if (isInEditMode()) {
        return;
    }
    crollBarColor = ContextCompat.getColor(context, R.color.blue);
}
...