রিসাইকেলার ভিউতে সর্বশেষ সন্তানের মার্জিন / প্যাডিং


126

আমি সর্বশেষ সারিতে প্যাডিং / মার্জিন বটম এবং প্রথম সারিতে প্যাডিং / মার্জিন শীর্ষ যুক্ত করার চেষ্টা করছি। আমি এটি আইএমএল xML এ করতে পারি না কারণ এটি আমার সমস্ত চাইল্ডকে প্রভাবিত করে।

আমার রিসাইক্লারভিউ অ্যাডাপ্টারে আমার শিরোনাম এবং শিশু রয়েছে যাতে আমি এটি ব্যবহার করতে পারি না

   android:padding="4dp"
   android:clipToPadding="false"

আমি প্রতিটি শিরোনামের শেষ প্রথম সারিতে পৃথকভাবে এটি ব্যবহার করতে হবে


এর মতো ব্যবহার করুন: <android.support.v7.widget.RecyclerView অ্যান্ড্রয়েড: আইডি = "@ + আইডি / তালিকা" অ্যান্ড্রয়েড: প্যাডিংবটম = "5 ডিপি" অ্যান্ড্রয়েড: লেআউট_উইথ = "ম্যাচ_প্যারেন্ট" অ্যান্ড্রয়েড: লেআউট_উইট = "র‌্যাপ_কন্টেন্ট" />
পঙ্কজ অরোড়া

আপনি অনবিন্দউহোল্ডারটিতে প্যাডিং এবং মার্জিন পরিবর্তন করতে পারবেন এবং তারপরে ভিউ ধারককে সেটআইসিরেকাইলেবল (মিথ্যা) কল করতে পারবেন
user3425867

উত্তর:


9

আমি কোটলিনে এটি ব্যবহার করি

override fun onBindViewHolder(holder: RecyclerView.ViewHolder(view), position: Int) {
    if (position == itemsList.lastIndex){
        val params = holder.itemView.layoutParams as FrameLayout.LayoutParams
        params.bottomMargin = 100
        holder.itemView.layoutParams = params
    }else{
        val params = holder.itemView.layoutParams as RecyclerView.LayoutParams
        params.bottomMargin = 0
        holder.itemView.layoutParams = params
    }
  //other codes ...
}

232

এই সমস্যাটি সমাধান করা আরও সহজ। আপনি RecylerViewনিজেই প্রয়োজনীয় প্যাডিং প্রয়োগ করতে পারেন এবং মিথ্যাতে সেট clipToPaddingকরতে পারেন, অন্যথায়, প্যাডিংটি আপনার স্ক্রোলিং অঞ্চলটি কেটে ফেলবে। এখানে একটি উদাহরণ

<android.support.v7.widget.RecyclerView
    android:padding="4dp"
    android:clipToPadding="false"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

প্যাডিং দেখুন উপরে এবং নীচে সহ সমস্ত পক্ষের 4dp যুক্ত হবে। তারপরে ক্লিপটোপ্যাডিং প্যারামিটারটি নিশ্চিত করে যে আপনার সন্তানের আইটেমগুলি কাটা না। এখন, 4dpআপনার সন্তানের আইটেমগুলির জন্য চারদিকে প্যাডিং যুক্ত করুন এবং আপনি যেতে ভাল। মোট আপনি পাশ এবং আইটেমের মধ্যে 8 ডিপি প্যাডিং পান।


হ্যাঁ আমি সাধারণত এটি করি তবে আমি আমার রিসাইক্লারভিউতে শিরোনাম নিয়ে গঠিত এবং প্রতিটি শিরোনামের নিজস্ব বাচ্চা রয়েছে, এজন্য আমাকে কেবল প্রতিটি শিরোনামের শেষ এবং প্রথম সারিতে প্রোগ্রামগতভাবে সেট করা দরকার
রেডইগল

আমি নিশ্চিত নই বুঝতে পেরেছি. এটি কীভাবে রিসাইক্লিউউয়ের ভিতরে শিরোনামগুলির সাথে সম্পর্কিত? আপনি কি শিরোনামগুলির কোনও প্যাডিং না করতে চান? এমনকি যদি এটি হয় তবে আপনি একই সমাধান ব্যবহার করে বাম এবং ডান প্যাডিং থেকে মুক্তি পেতে পারেন।
সাবিন সেবাস্তিয়ান

আমার শিরোনাম রয়েছে এবং প্রতিটি শিরোনামে বাচ্চাদের অ-নির্দিষ্ট গণনা রয়েছে তাই আমি শীর্ষ শিরোনাম / মার্জিন এবং প্রতিটি শিরোনামের শেষ সন্তানের প্রথম শিশু এবং নীচে প্যাডিং / মার্জিন যুক্ত করতে চাই।
রেডইগল

আমার একমাত্র ধারণাটি আমার শিরোনামের বিন্যাসে শীর্ষ এবং নীচের মার্জিনটি সেট করা হয়েছিল তবে আমি ভাবছিলাম যে এটির
উন্নতি করার কোনও চতুর

সেক্ষেত্রে আপনার শেষ সন্তানের পরে আপনি কেবল একটি জাল আইটেমটি রিসাইক্লার ভিউতে যুক্ত করতে পারেন। এটি অর্জনের সবচেয়ে স্মার্ট উপায় না হ'ল এটি সবচেয়ে সহজ। :)
সাবিন সেবাস্তিয়ান

82

উপরে এবং নীচের আইটেমগুলিতে প্যাডিং যুক্ত করার পরিবর্তে, আপনি কেবল আপনার পুনর্ব্যবহারযোগ্যের উপরে এবং নীচে প্যাডিং যুক্ত করতে পারেন এবং এতে clipToPaddingবৈশিষ্ট্যটি সেট করতে পারেন false

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:paddingTop="8dp"
    android:paddingBottom="8dp" />

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

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

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

38

ব্যবহার ItemDecoration:

private 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) {
        int position = parent.getChildAdapterPosition(view);
        boolean isLast = position == state.getItemCount()-1;
        if(isLast){
            outRect.bottom = space;
            outRect.top = 0; //don't forget about recycling...
        }
        if(position == 0){
            outRect.top = space;
            // don't recycle bottom if first item is also last
            // should keep bottom padding set above
            if(!isLast)
                outRect.bottom = 0;
        }
    }
}

এবং

//8dp as px
int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
            getResources().getDisplayMetrics()); // calculated
//int space = getResources().getDimensionPixelSize(
//    R.dimen.list_item_padding_vertical); // from resources
recyclerView.addItemDecoration(new SpacesItemDecoration(space));

1
আরে এটি রিসাইক্লার ভিউয়ের মতো বলে মনে হচ্ছে না tem আইটেম ডেকোরেশন রিসোর্স ক্লাস আর পাবেন, আমি কেবল এটি নির্মাণকারীর মধ্যে একটি যুক্তি হিসাবে যুক্ত করেছি।
ক্র্টকো

2
গুগ সমাধান! বিপরীত লেআউট সমর্থন সহ: gist.github.com/Miha-x64/4e8754e72a1e65e3ca742744ea501f16
মিহ_এক্স 64

2
এই উত্তর অবশ্যই upvated করা উচিত! যদিও সাবিন সেবাস্তিয়ান এর উত্তর ভাল কাজ করছে তবে আইটেমডেকারেশন সহ জায়গাগুলি সমান নয়।
ইরোইরোয়েস

1
তবে আইটেমগুলি সরিয়ে দেওয়ার পরে এটি সমস্ত আইটেমের জন্য অফসেটগুলি পুনরায়
চিত্রায়িত

সত্য হতে পারে, যেহেতু notifyItemInserted/ Removedকেবল একটি আইটেম আঁকতে / আইটেমটি সরিয়ে ফেলবে এবং পরিষ্কার করা এটি Viewঅন্যান্য সমস্ত শিশুকে ছোঁয়া ছাড়বে। উদাহরণস্বরূপ, যখন কিছু আইটেম তালিকার শীর্ষে রয়েছে (শীর্ষ প্যাডিং দিয়ে আঁকা) এবং আমরা শীর্ষে একটি নতুন যুক্ত করছি, তারপরে আগের-প্রথম-দ্বিতীয়-দ্বিতীয় আইটেমটি এখনও শীর্ষে প্যাড করা হবে ... সহজ notifyDataSetChangedফিক্সটি কল করা হয়েছে (বলপূর্বক পুনরায় আঁকুন) সমস্ত ...), আরও notifyItemChanged(newPositionOfOldFirstAndOrLastItem)
জটিলটির

28
<android.support.v7.widget.RecyclerView
    android:id="@+id/rv_tpf"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:paddingBottom="100dp" />

আপনার পুনর্ব্যবহারযোগ্য দর্শন যোগ করুন android:clipToPadding="false"এবং android:paddingBottom="100dp"


2
অসাধারণ! এটি নিখুঁত
কেভিনবি

16

অ্যান্ড্রয়েড যুক্ত করুন: ক্লিপটোপ্যাডিং = "মিথ্যা" এবং অ্যান্ড্রয়েড: প্যাডিংবটম = আপনার পুনর্ব্যবহারযোগ্য দৃশ্যে "65 ডিপি"। আপনি যদি রিসাইকেলার ভিউ সেলটিতে ফ্যাব মেনু বোতাম এবং ক্রিয়া ব্যবহার করেন।

<androidx.recyclerview.widget.RecyclerView
      android:id="@+id/dinner_recycler_view"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:clipToPadding="false"
      android:paddingBottom="65dp"/>

3

কোনও কারণে পুরানো clipToPadding=falseসমাধানটি আমার পক্ষে কাজ করছে না। সুতরাং আমি একটি আইটেম সজ্জা যুক্ত করেছি

https://gist.github.com/kassim/582888fa5960791264fc92bc41fb6bcf

public class BottomPaddingDecoration extends RecyclerView.ItemDecoration {
    private final int bottomPadding;

    public BottomPaddingDecoration(int bottomPadding) {
        this.bottomPadding = bottomPadding;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
        if (position == parent.getAdapter().getItemCount() - 1) {
            outRect.set(0, 0, 0, bottomPadding);
        }
    }
}

1

আমি আরও ভালর জন্য আশ্চর্যজনক উত্তর @ স্নাচেমস উত্তরটি সংশোধন করেছি এবং কীভাবে সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে আপনাকে ধারণা দিচ্ছি

public class SpacesItemDecoration extends DividerItemDecoration {
    private int space;

    public SpacesItemDecoration(Context clContext,int oriantation,int space) {
        super(clContext,oriantation);
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect,view,parent,state);
        int position = parent.getChildAdapterPosition(view);
        boolean isLast = position == state.getItemCount()-1;
        if(isLast){
            outRect.bottom = space;
            outRect.top = 0; //don't forget about recycling...
        }
       /* if(position == 0){
            outRect.top = space;
            // don't recycle bottom if first item is also last
            // should keep bottom padding set above
            if(!isLast)
                outRect.bottom = 0;
        }*/
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.