রিসাইক্লিউউতে আইটেমগুলির মধ্যে ডিভাইডার এবং স্পেসগুলি কীভাবে যুক্ত করবেন?


938

এটি ডিভাইডার এবং ডিভাইডারহাইট পরামিতি ListViewব্যবহার করে ক্লাসে এটি কীভাবে আগে করা যেত তার একটি উদাহরণ :

<ListView
    android:id="@+id/activity_home_list_view"
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:divider="@android:color/transparent"
    android:dividerHeight="8dp"/>

তবে আমি RecyclerViewক্লাসে এমন সম্ভাবনা দেখছি না ।

<android.support.v7.widget.RecyclerView
    android:id="@+id/activity_home_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"/>

সেক্ষেত্রে মার্জিনগুলি সংজ্ঞায়িত করা এবং / অথবা কোনও তালিকার আইটেমের বিন্যাসে সরাসরি একটি কাস্টম ডিভাইডার ভিউ যুক্ত করা ঠিক আছে বা আমার লক্ষ্য অর্জনের জন্য আরও ভাল উপায় আছে কি?


এটি আমাকে সহায়তা করেছে: stackoverflow.com/questions/26892296/…
জারেড বুরোজ

@ আইসক্লেয়ার আইটেমগুলি যোগ করুন <টেক্সটভিউ /> অন্য একটি এক্সএমএল এবং এটি একই ক্রিয়াকলাপ তালিকাতে ব্যবহার করুন।
অমিতসর্মা

7
সমর্থন com.homeretailgroup.argos.android.view.decorators.DividerItemDecorationmRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
লিবিতে

উল্লম্ব তালিকার জন্য আপনি আপনার তালিকা আইটেমের নীচে মার্জিন যুক্ত করতে পারেন এবং সম্ভবত এটি বিভাজক হিসাবে ব্যবহার করা যেতে পারে?
পুনর্বার67

সহজ উপায় হ'ল অ্যাডাপ্টারের সারিতে প্রথম আইটেমটির চারপাশে শীর্ষ / নীচের মার্জিন যুক্ত করা। অ্যান্ড্রয়েড layout_marginBottom = "4dp"। (নোট প্যারেন্ট লেআউটে মার্জিন যোগ করলে এটি কাটবে না))
pstorli

উত্তর:


1224

অক্টোবর 2016 আপডেট

অ্যান্ড্রয়েড সমর্থন লাইব্রেরির 25.0.0 সংস্করণটি DividerItemDecorationশ্রেণি চালু করেছে :

ডিভাইডার আইটেম ডেকোরেশন হ'ল একটি পুনর্ব্যবহারযোগ্য আইটেমডেকোরেশন যা এ এর ​​আইটেমগুলির মধ্যে বিভাজক হিসাবে ব্যবহার করা যেতে পারে LinearLayoutManager। এটি উভয় HORIZONTALএবং VERTICALওরিয়েন্টেশন সমর্থন করে ।

ব্যবহার:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
    layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);

পূর্ববর্তী উত্তর

কিছু উত্তর হয় হয় এমন পদ্ধতি ব্যবহার করে যেগুলি তখন থেকে অবনতিহীন হয়ে পড়েছে বা একটি সম্পূর্ণ সমাধান দেয় না, তাই আমি একটি সংক্ষিপ্ত, আপ টু ডেট র‌্যাপ-আপ করার চেষ্টা করেছি।


বিপরীতে ListView, RecyclerViewশ্রেণিতে কোনও বিভাজন সংক্রান্ত পরামিতি নেই। পরিবর্তে, আপনাকে প্রসারিত করতে হবে ItemDecoration, একটি RecyclerViewঅভ্যন্তর শ্রেণি:

একটি ItemDecorationঅ্যাপ্লিকেশনটিকে অ্যাডাপ্টারের ডেটা সেট থেকে নির্দিষ্ট আইটেমের দর্শনগুলিতে অফসেটকে একটি বিশেষ অঙ্কন এবং বিন্যাস যুক্ত করতে দেয়। এটি আইটেম, হাইলাইটস, ভিজ্যুয়াল গ্রুপিং সীমানা এবং আরও অনেকের মধ্যে বিভাজক অঙ্কনের জন্য কার্যকর হতে পারে।

সকল ItemDecorationsযাতে তারা যোগ করা হয় নি মধ্যে টানা হয় (আইটেম মতামত সামনে onDraw()() এবং আইটেম পর onDrawOver (ইন Canvas, RecyclerView, RecyclerView.State)

Vertical ব্যবধান ItemDecoration

প্রসারিত ItemDecorationকরুন heightএবং ওভাররাইড getItemOffsets()পদ্ধতি হিসাবে স্থান নেয় এমন কাস্টম কনস্ট্রাক্টর যুক্ত করুন :

public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {

    private final int verticalSpaceHeight;

    public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
        this.verticalSpaceHeight = verticalSpaceHeight;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        outRect.bottom = verticalSpaceHeight;
    }
}

আপনি যদি শেষ আইটেমের নীচে স্থান toোকাতে না চান তবে নিম্নলিখিত শর্তটি যুক্ত করুন:

if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
            outRect.bottom = verticalSpaceHeight;
}

দ্রষ্টব্য: আপনার কাছে পরিবর্তন করতে পারেন outRect.top, outRect.leftএবং outRect.rightপছন্দসই প্রভাব জন্য বৈশিষ্ট্য।

বিভাজক ItemDecoration

প্রসারিত ItemDecorationএবং ওভাররাইড onDraw()পদ্ধতি:

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    private Drawable divider;

    /**
     * Default divider will be used
     */
    public DividerItemDecoration(Context context) {
        final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
        divider = styledAttributes.getDrawable(0);
        styledAttributes.recycle();
    }

    /**
     * Custom divider will be used
     */
    public DividerItemDecoration(Context context, int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();

            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}

আপনি হয় প্রথম কনস্ট্রাক্টরকে কল করতে পারেন যা ডিফল্ট অ্যান্ড্রয়েড বিভাজক বৈশিষ্ট্য ব্যবহার করে বা দ্বিতীয়টি যা আপনার নিজস্ব অঙ্কনীয় ব্যবহার করে, উদাহরণস্বরূপ অঙ্কনযোগ্য / ডিভাইডার.এক্সএমএল

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="#ff992900" />
</shape>

দ্রষ্টব্য: আপনি যদি নিজের আইটেমগুলির উপর ডিভাইডার আঁকতে চান তবে onDrawOver()পরিবর্তে ওভাররাইড পদ্ধতি।

ব্যবহার

আপনার নতুন ক্লাসটি যুক্ত করতে VerticalSpaceItemDecorationবা যুক্ত DividerSpaceItemDecorationকরতে RecyclerViewউদাহরণস্বরূপ আপনার খণ্ডটির onCreateView()পদ্ধতিতে:

private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_feed, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);

    //add ItemDecoration
    recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
    //or
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
    //or
    recyclerView.addItemDecoration(
            new DividerItemDecoration(getActivity(), R.drawable.divider));

    recyclerView.setAdapter(...);

    return rootView;
}

এছাড়াও লুকাস রচার লাইব্রেরি রয়েছে যা আইটেমের সজ্জা প্রক্রিয়াটি সহজ করার কথা। যদিও চেষ্টা করে দেখেনি।

এর বৈশিষ্ট্যগুলির মধ্যে রয়েছে :

  • স্টক আইটেম সজ্জা সহ একটি সংগ্রহ:
  • আইটেমের ফাঁকা ফাঁকা অনুভূমিক / উল্লম্ব বিভাজক।
  • তালিকাবদ্ধ

3
@DPpin_sज्ञान আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি কোনও বস্তু তৈরি করি না onDraw()। আমি কেবল ইতিমধ্যে বিদ্যমান দৃষ্টান্ত রেফারেন্স।
আইসক্লেয়ার 2'15

1
আমি ভাবছি যদি আঁকার যোগ্য তৈরি করার পরিবর্তে পেইন্টটি ব্যবহার করা ভাল ধারণা হয়? তারপর আমি কল করতে পারেন canvas.drawLine(startX, startY, stopX, stopY, mPaint)মধ্যে onDrawOver? কোন পারফরম্যান্স পার্থক্য?
Arst

1
কেবল একটি তথ্যবহুল মন্তব্য: আপনার তালিকায় পরে আইটেম যুক্ত করার পরিকল্পনা থাকলে সর্বদা সর্বশেষ আইটেমটিতে স্থান যুক্ত করুন। যদি আপনি এটি না করেন, কোনও আইটেম যুক্ত করার সময়, এতে স্থান থাকবে না। উল্লম্বস্পেসের জন্য ধন্যবাদ!
সুহরেসু

24
আইটেমগুলি সম্পূর্ণরূপে অস্বচ্ছ হলে ডিভাইডার আইটেমডেকোরেশনটি কাজ করবে না, ডিভাইডারগুলি আইটেমগুলি দিয়ে ওভারড্রন হয়ে যাবে। সেক্ষেত্রে আপনাকে getItemOffsets () কেও ওভাররাইড করতে হবে এবং আউটআরেক্টে নীচে অফসেট যুক্ত করতে হবে যাতে আইটেমের বাইরে বিভাজকটি শেষ হয়। বিকল্পভাবে, আইটেমটি ডিভাইডার আঁকতে আপনি অনড্রও () এর পরিবর্তে ড্রডওভার () ওভাররাইড করতে পারেন।
jpop

115
রিসাইকেলারভিউতে কেবলমাত্র বিভাজক যুক্ত করার জন্য কোডের একটি সম্পূর্ণ পৃষ্ঠা হ'ল সেরা উত্তর। গুগল আপনাকে লজ্জা।
সাবধান

480

শুধু যোগ কর

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.VERTICAL));

এছাড়াও আপনার নির্ভরতা যুক্ত করতে হতে পারে
compile 'com.android.support:recyclerview-v7:27.1.0'

সম্পাদনা করুন:

এটিকে কিছুটা কাস্টমাইজ করার জন্য আপনি একটি কাস্টম অঙ্কনযোগ্য যুক্ত করতে পারেন:

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

উদাহরণস্বরূপ, আপনি যে কোনও কাস্টম অঙ্কনযোগ্য ব্যবহার করতে পারবেন:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <size android:height="0.5dp"/>
</shape>

ক্রিয়াকলাপের প্রয়োজন নেই। প্রসঙ্গটি যথেষ্ট
mac229

এটি অবশ্যই সঠিক উত্তর হবে। Plz, getActivity পরিবর্তন করুন কেবল প্রসঙ্গে।
ঝন ফ্রেডি ট্রুজিলো ওড়তেগা

এছাড়াও আপনার লেআউটম্যানেজারের কাছ থেকে অভিমুখী হওয়া আরও ভাল।
lsrom

ধন্যবাদ! এছাড়াও আপনি Configurationউল্লম্ব বিভাজকের জন্য ব্যবহার করতে পারেন :if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
অ্যালেক্সএস

3
উত্তম উত্তর, তবে এটি শেষ আইটেমের পরে একটি বিভাজক যুক্ত করে।
শীতলমান্ড

256

অ্যালেক্স ফু দ্বারা গিথুবের এই বিশেষ ফাইলটির দিকে আমি আপনার দৃষ্টি আকর্ষণ করতে পারি: https://gist.github.com/alexfu/0f464fc3742f134ccd1e

এটি ডিভাইডার আইটেমডেকোরেশন.জভা উদাহরণ ফাইলটি "সমর্থন গণতন্ত্র থেকে সরাসরি টানা হয়েছে" (( https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )

আমি আমার প্রকল্পে এই ফাইলটি আমদানি করার পরে বিভাজন রেখাগুলি সুন্দরভাবে পেতে সক্ষম হয়েছি এবং এটিকে পুনর্ব্যবহারকারী দৃশ্যে একটি আইটেম সজ্জা হিসাবে যুক্ত করতে পেরেছি।

আমার অনক্রিয়েটভিউটি আমার খণ্ডে পুনর্ব্যবহারযোগ্য ভিউটি দেখতে কেমন দেখাচ্ছে তা এখানে:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_recycler_view, container, false);

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    return rootView;
}

আমি নিশ্চিত অতিরিক্ত স্টাইলিং করা যেতে পারে তবে এটি একটি সূচনা পয়েন্ট। :)


আপনি কীভাবে এগুলি যুক্ত করবেন: "পাদলেখক বিভাজনসঞ্চারিত", "শিরোলেখকরা সক্ষম", "তালিকানির্বাচক", "ফাস্টস্ক্রোল সক্ষম", "স্মুথস্ক্রোলবার", "পাঠ্য ফিল্টারএনেবল"?
অ্যান্ড্রয়েড বিকাশকারী

স্টাইলিং কিভাবে লাগাতে পারে তার কোনও ইনপুট?
নিজম.স্প

এই সমাধানটিকে স্টাইল করতে আপনার থিমের "অ্যান্ড্রয়েড: লিস্টডাইভাইডার" বৈশিষ্ট্যটি ওভাররাইড করতে হবে
পাভেল দুডকা

1
বিভাজক পুনর্ব্যবহারকারী সাথে কাজ করে না। আপনার রিসাইক্লারভিউ.আইটিএমডেকোরেশন ব্যবহার করা দরকার। এই উত্তরটি দেখুন: stackoverflow.com/a/27664023/2311451
কোকরিকো

3
কেন বিভাজক আইটেমের পুরো প্রস্থ প্রসারিত করে? চশমাগুলিতে কীভাবে প্রদর্শিত হবে google.com/design/spec/compferences/lists.html#lists-specs
চিপ

156

ItemDecorationসমস্ত আইটেমের মধ্যে সমান স্থানের জন্য সহজ বাস্তবায়ন।

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpacesItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;

        // Add top margin only for the first item to avoid double space between items
        if(parent.getChildAdapterPosition(view) == 0) {
            outRect.top = space;
        }
    }
}

আমি স্থান পাচ্ছি তবে কীভাবে একটি ডিভাইডার
পাব

26
getChildPositionএখন হ্রাস করা হয়েছে, getChildAdapterPositionপরিবর্তে ব্যবহার করা যেতে পারে।
আইসক্লায়ার

4
কলটি সরাতে (যেমন আমি করেছি) ভুলে যাবেন না super.getItemOffsetsবা আপনার অফসেটগুলি ওভাররাইট করা হবে।
জায়েফকায়ে

@ আইসক্লেয়ার getChildLayoutPositionব্যবহার করা উচিত নয় ?
অবিনাশ আর

3
এটি পিক্সেলগুলিতে ব্যবধানটি কার্যকর করে?
ফিলিটি_উইজার্ড

108

সহজটি হ'ল রিসাইক্লিউউয়ের জন্য পটভূমি রঙ এবং আইটেমগুলির জন্য পৃথক পটভূমি রঙ সেট করা । এখানে একটি উদাহরণ ...

<android.support.v7.widget.RecyclerView
    android:background="#ECEFF1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"/>

এবং টেক্সটভিউ আইটেম (এটি কিছু হতে পারে) নীচে মার্জিন "x" ডিপি বা পিক্স সহ

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="1dp"
    android:background="#FFFFFF"/>

আউটপুট ...

এখানে চিত্র বর্ণনা লিখুন


2
কী কৌশল! লোড করার সময় কেবল তালিকাটি সাদা রাখা দরকার।
হামজেহ সোবহ

36
ওভারড্র থেকে সাবধান!
শেম

@ শেম আপনি কি বিস্তারিত বলতে পারেন?
রোমিনাভি

7
অ্যান্ড্রয়েডের একের পর এক স্তরগুলিতে অঙ্কনের সময় (ক্রিয়াকলাপের পটভূমি, রিসাইকাল ভিউ ব্যাকগ্রাউন্ড এবং আইটেম ভিউ ব্যাকগ্রাউন্ড) - অ্যান্ড্রয়েড সেগুলি সমস্তই আঁকায়, যা ব্যবহারকারীদের কাছে দৃশ্যমান নয়। এটিকে ওভারড্র বলা হয় এবং আপনার পারফরম্যান্সকে প্রভাবিত করতে পারে, এ সম্পর্কে আরও এখানে: youtube.com/watch?v=T52v50r-JfE
shem

41

আমি মনে করি সরল বিভাজক ব্যবহার

আপনাকে প্রতিটি আইটেমকে ডিভাইডার যুক্ত করতে সহায়তা করবে :
1- এটিকে অঙ্কনীয় ডিরেক্টরিতে যুক্ত করুন line_divider.xML

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
    android:width="1dp"
    android:height="1dp" />
<solid android:color="#999999" />
</shape>

2- সিম্পলডিভাইডার আইটেমডেকোরেশন ক্লাস তৈরি করুন
আমি এই ক্লাসটি সংজ্ঞায়িত করতে এই উদাহরণটি ব্যবহার করেছি:
https://gist.github.com/polbins/e37206fbc444207c0e92

package com.example.myapp;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.example.myapp.R;

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration{
private Drawable mDivider;

public SimpleDividerItemDecoration(Resources resources) {
    mDivider = resources.getDrawable(R.drawable.line_divider);
}

public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);

        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        int top = child.getBottom() + params.bottomMargin;
        int bottom = top + mDivider.getIntrinsicHeight();

        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
  }
}


3- ক্রিয়াকলাপ বা খণ্ডগুলিতে যা রিসাইক্লার ভিউ ব্যবহার করে অনক্রেটভিউয়ের অভ্যন্তরে এটি যুক্ত করুন:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
 RecyclerView myRecyclerView = (RecyclerView) layout.findViewById(R.id.my_recycler_view);
 myRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getResources()));
 ....
 }


4- আইটেমগুলির মধ্যে ব্যবধান যোগ করার
জন্য আপনার আইটেম ভিউতে প্যাডিং সম্পত্তি যুক্ত করতে হবে

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="4dp"
>
..... item structure
</RelativeLayout>

সেলগুলির মধ্যেও উল্লম্ব বিভাজক দেখানোর জন্য আমি গ্রিডলআউটআউট ম্যানেজারের জন্য এটি কীভাবে কাজ করব?
অ্যান্ড্রয়েড বিকাশকারী

2
রিসোর্স.জেটড্রেবল () এখন অবচয় করা হয়েছে। আপনি প্রসঙ্গে পাস করতে পারেন এবং ContextCompat.getDrawable (প্রসঙ্গ, R.drawable.line_divider) ব্যবহার করতে পারেন
এরিক বি

36

আমি যেমন সেট করেছি ItemAnimators। দ্যItemDecoratorপ্রবেশ করুন বা অ্যানিমেশন সহ প্রস্থান না।

আমি কেবল প্রতিটি আইটেমের আমার আইটেম ভিউ বিন্যাস ফাইলটিতে একটি ভিউ লাইন রেখে শেষ করেছি। এটা আমার কেস সমাধান করেছে। DividerItemDecorationএকটি সাধারণ বিভাজকের জন্য খুব বেশি যাদু বলে মনে হয়েছিল।

<View
    android:layout_width="match_parent"
    android:layout_height="1px"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:background="@color/lt_gray"/>

তুমি ঠিক. অ্যানিমেশন আইটেমডেকোরেশন দিয়ে কাজ করে না। আমি নিশ্চিত না কেন তবে আমাকে কিছু নির্দিষ্ট না করেই আমি অ্যানিমেশন পেয়েছি এবং আমি এটি খুব বিভ্রান্তিকর এবং কুরুচিপূর্ণ দেখতে পেয়েছি যে আইটেমডেকারেশন দ্বারা তৈরি লাইনগুলি অনুসরণ করে না। সুতরাং আমি আপনার মত একটি সমাধান ব্যবহার করব।
মিশেল

আপনি শেষ আইটেমটি কীভাবে মোকাবেলা করেছেন?
ওল্ডগোড

@ ওল্ডারগড আপনি ডান ব্যথা পয়েন্ট উপর ইশারা। আমি প্রথমে সর্বশেষ আইটেমটিতে বিভাজক তৈরির নকশার জন্য সম্মত হব। তবে যদি আপনি এটি না চান। এই ভিউতে একটি আইডি বরাদ্দ করুন এবং অবস্থান শেষ হলে বাইন্ডভিউতে লুকান।
জাভানেটর

@ জাভানেটর আমি ঠিক দেখছি, আমিও একই পদ্ধতি গ্রহণ করেছি। ধন্যবাদ।
ওল্ডগোড


27

এটি সহজ, আপনার এত জটিল কোডের দরকার নেই

DividerItemDecoration divider = new 
DividerItemDecoration(mRVMovieReview.getContext(), 
DividerItemDecoration.VERTICAL);
divider.setDrawable(
    ContextCompat.getDrawable(getBaseContext(), R.drawable.line_divider)
);
mRVMovieReview.addItemDecoration(divider);

এটি আপনার আঁকারে যুক্ত করুন: line_divider.xML

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
  android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="@android:color/black" />
</shape>

21

যেহেতু মেটালিয়াল ডিজাইনটি ব্যবহার করে এখনও এটি যথাযথভাবে প্রয়োগ করার সঠিক কোনও উপায় নেই, তাই তালিকার আইটেমটিতে সরাসরি একটি বিভাজক যুক্ত করার জন্য আমি কেবল নিম্নলিখিত কৌশলটি করেছি:

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dividerColor"/>

ডিভাইডার আইটেম সজ্জা আমার কাছে উপাদান ডিজাইনের কিছু উচ্চতা সম্পর্কিত তথ্য (ইনবক্সের মতো একই প্রভাব পেতে) পাওয়ার পরে কাজ করা বন্ধ করুন; এটি একটি সাধারণ জিনিস জন্য খুব জটিল হয়ে উঠেছে। এই সমাধানটি সহজ এবং কাজ করে।
ডেনিসজিএল

20

আমি কীভাবে ডিভাইডার ভিউ এবং ডিভাইডার ইনসেটগুলি পরিচালনা করছি তার মধ্যে একটি রিসাইক্লিউউ এক্সটেনশন যুক্ত করা।

1।

ভিউ বা রিসাইকেলার ভিউ নামকরণ করে একটি নতুন এক্সটেনশন ফাইল যুক্ত করুন:

RecyclerViewExtension.kt

এবং setDividerরিসাইক্লারভিউএক্সটেনশন.কেটি ফাইলের মধ্যে এক্সটেনশন পদ্ধতি যুক্ত করুন।

/*
* RecyclerViewExtension.kt
* */
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView


fun RecyclerView.setDivider(@DrawableRes drawableRes: Int) {
    val divider = DividerItemDecoration(
        this.context,
        DividerItemDecoration.VERTICAL
    )
    val drawable = ContextCompat.getDrawable(
        this.context,
        drawableRes
    )
    drawable?.let {
        divider.setDrawable(it)
        addItemDecoration(divider)
    }
}

2।

drawableপ্যাকেজের মতো একটি অঙ্কনযোগ্য সংস্থান ফাইল তৈরি করুন recycler_view_divider.xml:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="10dp"
    android:insetRight="10dp">

    <shape>
        <size android:height="0.5dp" />
        <solid android:color="@android:color/darker_gray" />
    </shape>

</inset>

যেখানে আপনি বাম এবং ডান নির্দিষ্ট করতে পারেন মার্জিন উপর android:insetLeftএবং android:insetRight

3।

আপনার ক্রিয়াকলাপ বা খণ্ডাংশে যেখানে পুনর্ব্যবহারযোগ্য ভিউ সূচনা করা হয়েছে, আপনি কল করে কাস্টম আঁকতে সেট করতে পারেন:

recyclerView.setDivider(R.drawable.recycler_view_divider)

4।

চিয়ার্স 🍺

বিভাজক সহ রিসাইক্লারভিউ সারি।


16

যদি কেউ কেবল আইটেমগুলির মধ্যে 10dp ব্যবধান যোগ করতে চাইছেন, তবে আপনি এখানে একটি অঙ্কনযোগ্য সেট করে এটি করতে পারেন DividerItemDecoration:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(
    recyclerView.getContext(),
    layoutManager.getOrientation()
);

dividerItemDecoration.setDrawable(
    ContextCompat.getDrawable(getContext(), R.drawable.divider_10dp)
); 

যেখানে divider_10dpএকটি অঙ্কনযোগ্য সংস্থান রয়েছে:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="10dp"/>
    <solid android:color="@android:color/transparent"/>
</shape>


11

এটি আসলে সমস্যার সমাধান করে না, তবে একটি অস্থায়ী কর্মক্ষেত্র হিসাবে, আপনি নিজের এক্সএমএল লেআউটে কার্ডটিতে ব্যবহারকম্প্যাটপ্যাডিং সম্পত্তি সেট করতে পারেন যাতে এটি প্রাক-ললিপপ সংস্করণে যেমন হয় তার পরিমাপ করতে পারে।

card_view:cardUseCompatPadding="true"


11

যারা আইটেমগুলির মধ্যে কেবল ফাঁকা সন্ধান করছেন তাদের জন্য RecyclerViewআমার দৃষ্টিভঙ্গিটি দেখুন যেখানে আপনি প্রথম এবং শেষ আইটেমগুলি বাদ দিয়ে যেখানে আমি বড় প্যাডিং দিয়েছি সেখানে সমস্ত আইটেমের মধ্যে সমান স্থান পাবেন। আমি কেবল প্যাডিংটি বাম / ডান অনুভূমিক LayoutManagerএবং উপরে / নীচে উল্লম্বভাবে প্রয়োগ করি LayoutManager

public class PaddingItemDecoration extends RecyclerView.ItemDecoration {

    private int mPaddingPx;
    private int mPaddingEdgesPx;

    public PaddingItemDecoration(Activity activity) {
        final Resources resources = activity.getResources();
        mPaddingPx = (int) resources.getDimension(R.dimen.paddingItemDecorationDefault);
        mPaddingEdgesPx = (int) resources.getDimension(R.dimen.paddingItemDecorationEdge);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        final int itemPosition = parent.getChildAdapterPosition(view);
        if (itemPosition == RecyclerView.NO_POSITION) {
            return;
        }
        int orientation = getOrientation(parent);
        final int itemCount = state.getItemCount();

        int left = 0;
        int top = 0;
        int right = 0;
        int bottom = 0;

        /** HORIZONTAL */
        if (orientation == LinearLayoutManager.HORIZONTAL) {
            /** all positions */
            left = mPaddingPx;
            right = mPaddingPx;

            /** first position */
            if (itemPosition == 0) {
                left += mPaddingEdgesPx;
            }
            /** last position */
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                right += mPaddingEdgesPx;
            }
        }
        /** VERTICAL */
        else {
            /** all positions */
            top = mPaddingPx;
            bottom = mPaddingPx;

            /** first position */
            if (itemPosition == 0) {
                top += mPaddingEdgesPx;
            }
            /** last position */
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                bottom += mPaddingEdgesPx;
            }
        }

        if (!isReverseLayout(parent)) {
            outRect.set(left, top, right, bottom);
        } else {
            outRect.set(right, bottom, left, top);
        }
    }

    private boolean isReverseLayout(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getReverseLayout();
        } else {
            throw new IllegalStateException("PaddingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException("PaddingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

dimens.xml

<resources>
    <dimen name="paddingItemDecorationDefault">10dp</dimen>
    <dimen name="paddingItemDecorationEdge">20dp</dimen>
</resources>

11

আপনার দৃষ্টিতে মার্জিন যুক্ত করুন, এটি আমার পক্ষে কাজ করেছে।

android:layout_marginTop="10dp"

আপনি যদি কেবল সমান ব্যবধান যোগ করতে চান এবং এটি এক্সএমএলpadding করতে চান তবে আপনার যে আইটেমটি আপনার মধ্যে ফুলে RecyclerViewউঠছে তার সমান পরিমাণে সেট করুন এবং পটভূমির বর্ণ ব্যবধানের রঙ নির্ধারণ করুন।layoutMarginRecyclerView


3
যদিও এটি কাজ করবে, এটি সঠিক উত্তর নয়, উদাহরণস্বরূপ, কারণ এটি সারি বিন্যাসে অতিরিক্ত জিনিস না করে সমস্যার সমাধান করে না, শীর্ষে, মার্জিন এক্স 1 প্রদর্শিত হবে, সারিগুলির মধ্যে মার্জিন x2 উপস্থিত হবে।
শ্রীকান্ত করুণাঘাট

এটি একটি ভাল ধারণা নয় কারণ overscrollতালিকার শেষে যখন টানানোর সময় প্যাডিং প্রয়োগ করা হয় তখন এটিতে একটি অপ্রয়োজনীয় প্যাডিং লাগানো হবেRecyclerView
এরিওচেলন

কোনও সাপোর্ট লাইব্রেরি কার্ডভিউতে আইটেমের বিন্যাসটি মোড়ানো ভাল তবে আপনি অন্যান্য বৈশিষ্ট্যগুলি যেমন উচ্চতা / ছায়া, ইত্যাদি নিয়ন্ত্রণ করতে পারেন: <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" card_view:cardElevation="4dp" <!-- your item's XML here --> </android.support.v7.widget.CardView>
কিপ 2

11
  • বিভাজক যোগ করার জন্য এখানে সহজ হ্যাক
  • নিম্নলিখিত হিসাবে আপনার পুনর্ব্যবহারযোগ্য আইটেমের বিন্যাসে কেবল একটি পটভূমি যুক্ত করুন

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_border"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dp">
    
    <ImageView
        android:id="@+id/imageViewContactLogo"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/ic_user" />
    
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.92"
        android:gravity="center|start"
        android:orientation="vertical">
    
    <TextView
        android:id="@+id/textViewContactName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    
    <TextView
        android:id="@+id/textViewStatusOrNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:singleLine="true"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>
    
    <TextView
        android:id="@+id/textViewUnreadCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:padding="5dp"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/red"
        android:textSize="22sp" />
    
    <Button
        android:id="@+id/buttonInvite"
        android:layout_width="54dp"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_add_friend" />
    </LinearLayout>

অঙ্কনযোগ্য ফোল্ডারে নিম্নলিখিত form_border.xML তৈরি করুন

  <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="rectangle" >
       <gradient
        android:angle="270"
        android:centerColor="@android:color/transparent"
        android:centerX="0.01"
        android:startColor="#000" />
    </shape>

এখানে চূড়ান্ত ফলাফল - বিভাজক সহ একটি পুনর্ব্যবহারযোগ্য।

এখানে চূড়ান্ত ফলাফল - বিভাজক সহ একটি পুনর্ব্যবহারযোগ্য।


1
এটি পছন্দসই পদ্ধতি নয়। যদিও @ আইসকলিয়ার উত্তরটি অনড্র-এ শুরু করেছে এবং parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1সম্ভবত এটি হওয়ার parent.getChildAdapterPosition(view) > 0সাথে থাকা উচিত এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। outRect.bottom = mVerticalSpaceHeightoutRect.top = mVerticalSpaceHeight
ড্রপপিন_সায়েন্স

@DPpin_sज्ञान - আপনি কেবল এটিকে পছন্দ করে না বলে মন্তব্য করে অবহেলা করতে পারবেন না, এটি প্রত্যাশার মতো সঠিক ফলাফল দেয়, আমি আইসক্রিয়ার এর উত্তরও দেখি তবে উত্তরটি একটি সাধারণ বিভাজকের পক্ষে খুব জটিল, তবে যদি প্রয়োজন হয় তবে আইটেমটি দিয়ে কিছু অতিরিক্ত সজ্জা করুন তবে তা গ্রহণযোগ্য উত্তর হতে পারে।
টারবান্ড্রয়েড

নিম্ন ভোটারদের জন্য, এই উত্তরটি তখন দেওয়া হয়েছিল যখন ডিভাইডার আইটেমডেকোরেশনের জন্য কোনও অফিসিয়াল ক্লাস ছিল না, সুতরাং এই উত্তর এবং লিও ড্রডকোডার প্রদত্ত নিম্নলিখিত উত্তরগুলির মধ্যে সময়ের ব্যবধানটি কেবল তুলনা করুন। :)
টারবন্ড্রয়েড

9

আমি কোনও পুরানো গিস্টের থেকে ডিভাইডার আইটেমডেকোরেশনকে কাঁটাচামচ করেছিলাম এবং আমার ব্যবহারের ক্ষেত্রে ফিট করার জন্য এটি সরল করে দিয়েছি এবং তালিকার ভিউতে যেভাবে আঁকতে হয় তাতে শেষের তালিকার আইটেমের পরে কোনও বিভাজককেও আঁকতে আমি এটি সংশোধন করেছি। এটি উল্লম্ব আইটেম অ্যানিমেটার অ্যানিমেশনগুলিও পরিচালনা করবে:

1) আপনার প্রকল্পে এই শ্রেণি যুক্ত করুন:

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
    private Drawable divider;

    public DividerItemDecoration(Context context) {
        try {
            final TypedArray a = context.obtainStyledAttributes(ATTRS);
            divider = a.getDrawable(0);
            a.recycle();
        } catch (Resources.NotFoundException e) {
            // TODO Log or handle as necessary.
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (divider == null) return;
        if (parent.getChildAdapterPosition(view) < 1) return;

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL)
            outRect.top = divider.getIntrinsicHeight();
        else
            throw new IllegalArgumentException("Only usable with vertical lists");
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (divider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();
        final int childCount = parent.getChildCount();

        for (int i = 0; i < childCount; ++i) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int size = divider.getIntrinsicHeight();
            final int top = (int) (child.getTop() - params.topMargin - size + child.getTranslationY());
            final int bottom = top + size;
            divider.setBounds(left, top, right, bottom);
            divider.draw(c);

            if (i == childCount - 1) {
                final int newTop = (int) (child.getBottom() + params.bottomMargin + child.getTranslationY());
                final int newBottom = newTop + size;
                divider.setBounds(left, newTop, right, newBottom);
                divider.draw(c);
            }
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (!(parent.getLayoutManager() instanceof LinearLayoutManager))
            throw new IllegalStateException("Layout manager must be an instance of LinearLayoutManager");
        return ((LinearLayoutManager) parent.getLayoutManager()).getOrientation();
    }
}

2) আপনার রিসেলারভিউতে সজ্জা যুক্ত করুন:

recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));

সঠিক, এটি লিনিয়ারআউটআউট ম্যানেজারের জন্য। গ্রিডলাউটম্যানেজারের জন্য এটি খাপ খাইয়ে নিতে আপনি এর পিছনে ধারণাটি নিতে পারেন।
ওপেনজিএল ইএস

8

পরিবর্তে shape xmlডিভাইডার উচ্চতা এবং রঙ পরিবর্তনের জন্য একটি তৈরি করুন । আপনি প্রোগ্রামগতভাবে তৈরি করতে পারেন

val divider = DividerItemDecoration(context,
        DividerItemDecoration.VERTICAL)

divider.setDrawable(ShapeDrawable().apply {
    intrinsicHeight = resources.getDimensionPixelOffset(R.dimen.dp_15)
    paint.color = Color.RED // note: currently (support version 28.0.0), we can not use tranparent color here, if we use transparent, we still see a small divider line. So if we want to display transparent space, we can set color = background color or we can create a custom ItemDecoration instead of DividerItemDecoration. 
})

recycler_devices.addItemDecoration(divider)

এটি দরকারী উত্তর
তাহা

7

একটি গুগল অনুসন্ধান থেকে নেওয়া, এই আইটেমডেকোরেশন আপনার যুক্ত করুন RecyclerView:

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private Drawable mDivider;
private boolean mShowFirstDivider = false;
private boolean mShowLastDivider = false;


public DividerItemDecoration(Context context, AttributeSet attrs) {
    final TypedArray a = context
            .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
    mDivider = a.getDrawable(0);
    a.recycle();
}

public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
        boolean showLastDivider) {
    this(context, attrs);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
}

public DividerItemDecoration(Drawable divider) {
    mDivider = divider;
}

public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
        boolean showLastDivider) {
    this(divider);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
        RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (mDivider == null) {
        return;
    }
    if (parent.getChildPosition(view) < 1) {
        return;
    }

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
        outRect.top = mDivider.getIntrinsicHeight();
    } else {
        outRect.left = mDivider.getIntrinsicWidth();
    }
}

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    if (mDivider == null) {
        super.onDrawOver(c, parent, state);
        return;
    }

    // Initialization needed to avoid compiler warning
    int left = 0, right = 0, top = 0, bottom = 0, size;
    int orientation = getOrientation(parent);
    int childCount = parent.getChildCount();

    if (orientation == LinearLayoutManager.VERTICAL) {
        size = mDivider.getIntrinsicHeight();
        left = parent.getPaddingLeft();
        right = parent.getWidth() - parent.getPaddingRight();
    } else { //horizontal
        size = mDivider.getIntrinsicWidth();
        top = parent.getPaddingTop();
        bottom = parent.getHeight() - parent.getPaddingBottom();
    }

    for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
        View child = parent.getChildAt(i);
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        if (orientation == LinearLayoutManager.VERTICAL) {
            top = child.getTop() - params.topMargin;
            bottom = top + size;
        } else { //horizontal
            left = child.getLeft() - params.leftMargin;
            right = left + size;
        }
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }

    // show last divider
    if (mShowLastDivider && childCount > 0) {
        View child = parent.getChildAt(childCount - 1);
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
        if (orientation == LinearLayoutManager.VERTICAL) {
            top = child.getBottom() + params.bottomMargin;
            bottom = top + size;
        } else { // horizontal
            left = child.getRight() + params.rightMargin;
            right = left + size;
        }
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

private int getOrientation(RecyclerView parent) {
    if (parent.getLayoutManager() instanceof LinearLayoutManager) {
        LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
        return layoutManager.getOrientation();
    } else {
        throw new IllegalStateException(
                "DividerItemDecoration can only be used with a LinearLayoutManager.");
    }
}
}

এটি কেবল লিনিয়ারলআউটআমনেজারের পক্ষে দুর্দান্ত কাজ করে। গ্রিডলাউটম্যানেজারের জন্য কী করা উচিত?
অ্যান্ড্রয়েড বিকাশকারী 0

6

এই লিঙ্কটি আমার জন্য কবজির মতো কাজ করেছে:

https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;
    private boolean mShowFirstDivider = false;
    private boolean mShowLastDivider = false;


    public DividerItemDecoration(Context context, AttributeSet attrs) {
        final TypedArray a = context
                .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
            boolean showLastDivider) {
        this(context, attrs);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    public DividerItemDecoration(Drawable divider) {
        mDivider = divider;
    }

    public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
            boolean showLastDivider) {
        this(divider);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (mDivider == null) {
            return;
        }
        if (parent.getChildPosition(view) < 1) {
            return;
        }

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
            outRect.top = mDivider.getIntrinsicHeight();
        } else {
            outRect.left = mDivider.getIntrinsicWidth();
        }
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mDivider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        // Initialization needed to avoid compiler warning
        int left = 0, right = 0, top = 0, bottom = 0, size;
        int orientation = getOrientation(parent);
        int childCount = parent.getChildCount();

        if (orientation == LinearLayoutManager.VERTICAL) {
            size = mDivider.getIntrinsicHeight();
            left = parent.getPaddingLeft();
            right = parent.getWidth() - parent.getPaddingRight();
        } else { //horizontal
            size = mDivider.getIntrinsicWidth();
            top = parent.getPaddingTop();
            bottom = parent.getHeight() - parent.getPaddingBottom();
        }

        for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getTop() - params.topMargin;
                bottom = top + size;
            } else { //horizontal
                left = child.getLeft() - params.leftMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }

        // show last divider
        if (mShowLastDivider && childCount > 0) {
            View child = parent.getChildAt(childCount - 1);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getBottom() + params.bottomMargin;
                bottom = top + size;
            } else { // horizontal
                left = child.getRight() + params.rightMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException(
                    "DividerItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

তারপরে আপনার ক্রিয়াকলাপে:

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(this, null));

অথবা এটি যদি আপনি কোনও খণ্ড ব্যবহার করছেন:

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity(), null));

1
এটি সূক্ষ্মভাবে কাজ করে, তবে এটি তালিকার শেষ আইটেমের অধীনে বিভাজকটি দেখায় না। আমি এটা ভালো প্রয়োজন: mShowFirstDivider = false, mShowLastDivider = true, কিন্তু এটা কাজ করবে না। কোন ধারণা কেন?
নাইটফিক্সড

এটি গ্রিডলাউটম্যানেজারকে ভালভাবে পরিচালনা করতে পারে না।
অ্যান্ড্রয়েড বিকাশকারী

6

আমরা রিসাইক্লারভিউ যেমন ডিভাইডার আইটেম সারণীর সাথে সংযুক্ত বিভিন্ন সজ্জকার ব্যবহার করে আইটেমগুলি সজ্জিত করতে পারি:

আইসক্লেয়ারের উত্তর থেকে নেওয়া কেবল ... নিম্নলিখিতটি ব্যবহার করুন

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

private Drawable mDivider;

/**
 * Default divider will be used
 */
public DividerItemDecoration(Context context) {
    final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
    mDivider = styledAttributes.getDrawable(0);
    styledAttributes.recycle();
}

/**
 * Custom divider will be used
 */
public DividerItemDecoration(Context context, int resId) {
    mDivider = ContextCompat.getDrawable(context, resId);
}

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);

        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        int top = child.getBottom() + params.bottomMargin;
        int bottom = top + mDivider.getIntrinsicHeight();

        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

} এবং তারপরে নীচের মত উপরেরটি ব্যবহার করুন

RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
recyclerView.addItemDecoration(itemDecoration);

এটি নীচের প্রদর্শিত হিসাবে তালিকার মধ্যে প্রতিটি আইটেমের মধ্যে বিভাজক প্রদর্শন করবে:

এখানে চিত্র বর্ণনা লিখুন

এবং যারা আরও বিশদ সম্পর্কে সন্ধান করছেন তাদের জন্য রিসাইক্লারভিউ _ কোডপথ অ্যান্ড্রয়েড ক্লিফোটগুলি ব্যবহার করে এই গাইডটি পরীক্ষা করে দেখতে পারেন

কিছু উত্তর এখানে মার্জিনের ব্যবহারের পরামর্শ দেয় তবে ধরা পড়ার বিষয়টি হ'ল: আপনি উপরের এবং নীচের উভয় মার্জিন যুক্ত করলে আইটেমগুলির মধ্যে এগুলি উভয়ই যুক্ত হবে এবং সেগুলি খুব বড় হবে। আপনি যদি কেবলমাত্র যোগ করেন তবে পুরো তালিকার শীর্ষে বা নীচে কোনও মার্জিন থাকবে না। যদি আপনি শীর্ষে অর্ধেকটি নীচে, অর্ধেকটি নীচে যোগ করেন তবে বাইরের মার্জিনগুলি খুব ছোট হবে।

সুতরাং, একমাত্র নান্দনিকভাবে সঠিক সমাধান হ'ল বিভাজক যা সিস্টেম জানে কোথায় সঠিকভাবে প্রয়োগ করতে হবে: আইটেমগুলির মধ্যে তবে আইটেমের উপরে বা নীচে নয়।

দয়া করে নীচের মন্তব্যে কোনও সন্দেহ সম্পর্কে আমাকে জানান:


1
DividerItemDecorationকোডটির মতো দেখতে এটি ডেমো করে না ।
ইগোরগানাপলস্কি

1
এটি একটি এওএসপি ক্লাস, আমি আপনার জন্য কোডটি খনন করেছি ..... gist.githubusercontent.com/alexfu/0f464fc3742f134ccd1e/raw/…
অনুদীপ সামাইয়া

এটি ভালভাবে কাজ করে না: এটি বিভিন্ন উচ্চতার সারিগুলি পরিচালনা করে না এবং এটি গ্রিডগুলির জন্য একটি উল্লম্ব বিভাজক প্রদর্শন করে না
অ্যান্ড্রয়েড বিকাশকারী

5

খুব দেরিতে তবে GridLayoutManagerআমি এটি ব্যবহার করার জন্য :

public class GridSpacesItemDecoration : RecyclerView.ItemDecoration
{
    private int space;

    public GridSpacesItemDecoration(int space) {
        this.space = space;
    }

    public override void GetItemOffsets(Android.Graphics.Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        var position = parent.GetChildLayoutPosition(view);

        /// Only for GridLayoutManager Layouts
        var manager = parent.GetLayoutManager() as GridLayoutManager;

        if (parent.GetChildLayoutPosition(view) < manager.SpanCount)
            outRect.Top = space;

        if (position % 2 != 0) {
            outRect.Right = space;
        }

        outRect.Left = space;
        outRect.Bottom = space;
    }
}

আপনার যে কোনও স্প্যান গণনার জন্য এই কাজ।

Ollie।


শীর্ষ স্থান সম্পর্কে, আপনি কীভাবে এটি সমর্থন করতে পরিবর্তন করবেন FlexboxLayoutManager?
অ্যান্ড্রয়েড বিকাশকারী

5

আপনি অগ্রগতি সহ সহজেই যুক্ত করতে পারেন।

যদি আপনার লেআউট ম্যানেজার লিনিয়ারলআউট হয় তবে আপনি ব্যবহার করতে পারেন:

ডিভাইডার আইটেম ডেকোরেশন হ'ল একটি রিসাইক্লার ভিউ.আইটেমডেকোরেশন যা লিনিয়ারলআউটআমনেজারের আইটেমগুলির মধ্যে বিভাজক হিসাবে ব্যবহার করা যেতে পারে। এটি উভয় আঞ্চলিক এবং ভার্টিকাল অভিযোজনকে সমর্থন করে।

 mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
         mLayoutManager.getOrientation());
 recyclerView.addItemDecoration(mDividerItemDecoration);

সূত্র


5

আমি মনে করি যে XML ব্যবহার করে না এমন একটি সাধারণ, কোড ভিত্তিক উত্তরের প্রয়োজন

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);

ShapeDrawable shapeDrawableForDivider = new ShapeDrawable(new RectShape());

int dividerThickness = // (int) (SomeOtherView.getHeight() * desiredPercent);
shapeDrawableForDivider.setIntrinsicHeight(dividerThickness);
shapeDrawableForDivider.setAlpha(0);

dividerItemDecoration.setDrawable(shapeDrawableForDivider);

recyclerView.addItemDecoration(dividerItemDecoration);

4

আপনি যদি আইটেমগুলির জন্য একই স্থান যুক্ত করতে চান তবে সহজ উপায় হ'ল রিসাইকেলভিউয়ের জন্য শীর্ষ + বাম প্যাডিং এবং কার্ড আইটেমগুলিতে ডান + নীচে মার্জিন যুক্ত করা।

dimens.xml

<resources>
    <dimen name="divider">1dp</dimen>
</resources>

list_item.xml

<CardView
 android:layout_marginBottom="@dimen/divider"
 android:layout_marginRight="@dimen/divider">
 ...
</CardView>

list.xml

<RecyclerView
 android:paddingLeft="@dimen/divider"
 android:paddingTop="@dimen/divider"
/>

4

আমি নীচের মত তালিকাগুলিতে একটি লাইন যুক্ত করেছি

<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/dividerColor"/>

1px পাতলা রেখা আঁকবে।

আপনি যদি শেষ সারিটির divider.setVisiblity(View.GONE);জন্য বিভাজকটি আড়াল করতে চান তবে সর্বশেষ তালিকার আইটেমটির জন্য অনবিন্দভিউহোল্ডারটিতে।


1
আমি এটিকে পছন্দ করি, অন্যেরা 'খুব জটিল।
স্যাম চেন

3

এর RecyclerViewথেকে কিছুটা আলাদা ListView। আসলে এটির মতো কাঠামোর RecyclerViewপ্রয়োজন ListViewlike উদাহরণস্বরূপ, ক LinearLayoutLinearLayoutপ্রতিটি উপাদান বিভাজক জন্য প্যারামিটার আছে। নীচের কোডটিতে আমার কাছে একটি "প্যাডিং" যুক্ত একটি বস্তুর RecyclerViewসমন্বয়ে রয়েছে যা আইটেমগুলির মধ্যে কিছু জায়গা রেখে দেবে। সেই জায়গাটিকে সত্যিই ছোট করুন এবং আপনি একটি লাইন পান।CardViewLinearLayout

এখানে রিসাইক্লারভিউ_লেআউটআউট.এক্সএমএল-এ পুনর্ব্যবহারকারী ভিউ

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ToDoList">

    <!-- A RecyclerView with some commonly used attributes -->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/todo_recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

এবং প্রতিটি আইটেমটি দেখতে দেখতে এখানে রয়েছে (এবং এটি অ্যান্ড্রয়েডের কারণে বিভক্ত হিসাবে দেখায়: লিনিয়ারলআউটে প্যাডিং যা সবকিছুকে ঘিরে রেখেছে))

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    **android:padding="@dimen/activity_vertical_margin"**>
    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:elevation="30dp"
        card_view:cardElevation="3dp">
            <TextView
                android:id="@+id/info_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />
    </android.support.v7.widget.CardView>
</LinearLayout>

3

একটি রিসাইক্লারভিউ-ফ্লেক্সিবল ডিভাইডার ব্যবহার করা খুব সহজ সমাধান

নির্ভরতা যুক্ত করুন:

compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'

আপনার পুনর্ব্যবহারযোগ্য দর্শন যোগ করুন:

recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(context).build());

এবং তুমি করে ফেলেছ!


কবজির মতো কাজ করে ... ওপেন সোর্স ভাগ করে নেওয়া পছন্দ করে।
বিলি

3

1. ওয়ে এর একটিতে কার্ডভিউ এবং রিসাইক্লার ভিউ একসাথে ব্যবহার করে আমরা সহজেই বিভাজকের মতো প্রভাব যুক্ত করতে পারি। প্রাক্তন। https://developer.android.com/training/material/lists-cards.html

২. এবং অন্যটি হ'ল রিসাইকেলার দৃশ্যের তালিকা_লম্বী_আউটআউটকে বিভাজক হিসাবে যুক্ত করা ।

        <View
            android:id="@+id/view1"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorAccent" />

3
public class CommonItemSpaceDecoration extends RecyclerView.ItemDecoration {

        private int mSpace = 0;
        private boolean mVerticalOrientation = true;

    public CommonItemSpaceDecoration(int space) {
        this.mSpace = space;
    }

    public CommonItemSpaceDecoration(int space, boolean verticalOrientation) {
        this.mSpace = space;
        this.mVerticalOrientation = verticalOrientation;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.top = SizeUtils.dp2px(view.getContext(), mSpace);
        if (mVerticalOrientation) {
            if (parent.getChildAdapterPosition(view) == 0) {
                outRect.set(0, SizeUtils.dp2px(view.getContext(), mSpace), 0, SizeUtils.dp2px(view.getContext(), mSpace));
            } else {
                outRect.set(0, 0, 0, SizeUtils.dp2px(view.getContext(), mSpace));
            }
        } else {
            if (parent.getChildAdapterPosition(view) == 0) {
                outRect.set(SizeUtils.dp2px(view.getContext(), mSpace), 0, 0, 0);
            } else {
                outRect.set(SizeUtils.dp2px(view.getContext(), mSpace), 0, SizeUtils.dp2px(view.getContext(), mSpace), 0);
            }
        }
    }
}

এর ফলে প্রতিটি আইটেমের উপরের এবং নীচের (অথবা বাম এবং ডান) আপনার কাছে সেট করতে পারেন .Then মধ্যে স্থান যোগ করা হবে recyclerView

recyclerView.addItemDecoration(new CommonItemSpaceDecoration(16));

SizeUtils.java

public class SizeUtils {
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.