Установить пользовательскую разделительную линию между элементами RecyclerView - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь установить пунктирную линию пользовательского разделителя между Recyclerview такими элементами:

enter image description here

XML:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">

    <stroke
        android:width="1dp"
        android:color="#000"
        android:dashWidth="20px"
        android:dashGap="50px" />
</shape>

Java:

DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
itemDecorator.setDrawable(ContextCompat.getDrawable(getContext(), R.drawable.dashedline));

код выше не работает вместо пунктирной линии, я получаю это:

enter image description here

1 Ответ

1 голос
/ 30 апреля 2019

DividerItemDecoration предполагает, что предоставленный вами объект рисования представляет собой сплошной прямоугольник и досадно игнорирует ваше определение XML строки. Обходной путь, который я нашел, состоит в том, чтобы создать мозаичный BitmapDrawable вручную, например ::1003*

    // get pixel count for 1 dip
    float dip1 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1f, getContext().getResources().getDisplayMetrics());

    // create a bitmap to draw our dash
    Bitmap bitmap = Bitmap.createBitmap((int)(15f * dip1) , (int)dip1, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();

    // fill the bitmap with the background colour of the list items
    canvas.drawColor(listItemBackgroundColour);

    // create a dash effect dash with = 10 dip, dash gap = 5 dip
    paint.setPathEffect(new DashPathEffect(new float [] { 10f * dip1, 5f * dip1 }, 0));

    // draw a single pixel wide line across the bitmap
    paint.setStrokeWidth(dip1);
    paint.setColor(lineColour);
    paint.setStyle(Paint.Style.STROKE);
    canvas.drawLine(0f, dip1 / 2f, 15f * dip1, dip1 / 2f, paint);

    // now create a tiled drawable using the bitmap
    BitmapDrawable drawable = new BitmapDrawable(context.getResources(), bitmap);
    drawable.setTileModeX(Shader.TileMode.REPEAT);

    // pass the drawable to the item decorator
    DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), layoutManager.getOrientation());
    itemDecorator.setDrawable(drawable);
    addItemDecoration(itemDecorator);

Не такой аккуратный, как определение ресурса формы XML, но он делает свое дело.

Обратите внимание, что вам нужно знать цвет фона элементов рециркуляции, чтобы смешаться в пунктирной линии, в противном случае вы получите цвет фона темы, отображаемый через пробелы в черточках.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...