मैं एंड्रॉइड के लिए नया हूं और इसलिए आरवी और मैं उस लेआउट को प्राप्त करने की कोशिश कर रहा हूं जहां पहला और आखिरी कार्ड केंद्रित नहीं है और इसके बजाय उनके बाद और पहले अधिक कार्ड दिखाता है। हो सकता है कि इस मामले में मैं दूसरे कार्ड के लिए 16dp और अंतिम कार्ड के लिए एक ही चीज़ देख सकता हूं जो पहले और आखिरी कार्ड को केंद्रित नहीं करता है। लेकिन बाकी कार्डों के लिए प्रत्येक 8dp ताकि मध्यवर्ती कार्ड केंद्रित दिखाई दें। हो सकता है कि किसी भी तरह दूसरे और अंतिम कार्ड के लिए किसी भी तरह आइटम सजावट का उपयोग करना।

enter image description here

मैं यहां जो सुझाव दिया गया है उसका पालन करके अगले और पिछले कार्ड के कुछ हिस्सों को दिखाने में सक्षम था, लेकिन यह केवल सभी कार्डों को समान रूप से केंद्रित करता है: अगले/पिछले कार्ड का हिस्सा कैसे दिखाएं RecyclerView

मैंने getItemOffsets को ओवरराइड करने का प्रयास किया लेकिन जब भी मैं पहले या आखिरी कार्ड पर स्क्रॉल करता हूं तो यह हर बार ट्रिगर हो जाता है और दूसरे और दूसरे को अंतिम कार्ड में गलत तरीके से ले जाता है और जब मैं उन्हें स्क्रॉल करता हूं तो उन्हें सही तरीके से केंद्रित नहीं करता है।

  public static class MyItemDecoration extends RecyclerView.ItemDecoration {

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

      final int itemPosition = parent.getChildAdapterPosition(view);
      if (itemPosition == RecyclerView.NO_POSITION) {
        return;
      }

      final int itemCount = state.getItemCount();
      if (itemCount > 0 && itemPosition == 1) {
        outRect.left -= 16;
        outRect.right -= 16;
      }

      else if (itemCount > 0 && itemPosition == itemCount - 1) {
        outRect.left += 16;
        outRect.right += 16;
      }
    }
  }

आरवी सेटअप

 SnapHelper snapHelper = new PagerSnapHelper();
        RecyclerView rv = getBinding().rv;
        rv.setOnFlingListener(null);
        snapHelper.attachToRecyclerView(rv);
1
RamPrasadBismil 24 मई 2019, 21:23

1 उत्तर

सबसे बढ़िया उत्तर

PagerSnapHelper सजावट सहित RecyclerView आइटम को केंद्र में रखता है, इसलिए, जब तक कि सजावट की चौड़ाई संतुलित न हो, वे हमेशा केंद्रित नहीं रहेंगे। हो सकता है कि आप यही देख रहे हों।

सजावट के लिए निम्नलिखित प्रयास करें। यह कोड पहले आइटम की शुरुआत और अंतिम आइटम के अंत में पूर्ण-चौड़ाई वाली सजावट लागू करता है; अन्यथा, आधी सजावट चौड़ाई का उपयोग किया जाता है। इस तरह से सजावट स्थापित करके, आप उन वस्तुओं को केंद्रित कर रहे हैं जिनमें संतुलित बाएँ और दाएँ सजावट हैं।

DividerItemDecoration decoration =
        new DividerItemDecoration(getApplicationContext(), HORIZONTAL) {
            private int mDecorationWidth = (int) (getResources().getDisplayMetrics().density * 8);

            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                                       RecyclerView.State state) {
                final int pos = parent.getChildAdapterPosition(view);
                if (pos == RecyclerView.NO_POSITION) {
                    return;
                }
                if (pos == 0) {
                    outRect.set(mDecorationWidth, 0, mDecorationWidth / 2, 0);
                } else if (pos == parent.getAdapter().getItemCount() - 1) {
                    outRect.set(mDecorationWidth / 2, 0, mDecorationWidth, 0);
                } else {
                    outRect.set(mDecorationWidth / 2, 0, mDecorationWidth / 2, 0);
                }
            }
        };

यहां एक वीडियो है जो ग्रे वर्टिकल डिवाइडर के साथ परिणाम दिखा रहा है।

enter image description here

अगर आपके पास पहले से ही सजावट आपकी संतुष्टि के लिए काम कर रही है, तो आप पहले और आखिरी दृश्य को छोड़कर सभी दृश्यों को केंद्र में रखने के लिए calculateDistanceToFinalSnap() को PagerSnapHelper में ओवरराइड कर सकते हैं। देखें calculatedistanceto finalsnap()। एक बार जब PageSnapHelper स्नैप करने के लिए एक लक्ष्य दृश्य की पहचान कर लेता है, तो calculatedistancetofinalsnap() को यह निर्धारित करने के लिए कहा जाता है कि स्नैप को निष्पादित करने के लिए कितने पिक्सेल को स्थानांतरित करना है। यहां, हम RecyclerView में दृश्य (बिना सजावट के) को केंद्रित करने के लिए पर्याप्त पिक्सेल ले जा रहे हैं। PageSnapHelper पहले और आखिरी आइटम के लिए सही काम करता है, इसलिए हम इनके लिए सुपर को ही कॉल करते हैं।

PagerSnapHelper pagerSnapHelper = new PagerSnapHelper() {  

    @Override  
  public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager,  
                                              @NonNull View targetView) {  
        LinearLayoutManager lm = (LinearLayoutManager) layoutManager;  
        int pos = mRecycler.getChildAdapterPosition(targetView);  
        // If first or last view, the default implementation works.  
  if (pos == 0 || pos == lm.getItemCount() - 1) {  
            return super.calculateDistanceToFinalSnap(layoutManager, targetView);  
        }  
        // Force centering in the view without its decorations. 
        // targetCenter is the location of the center of the view we want to center. 
        int targetCenter = targetView.getLeft() + targetView.getWidth() / 2;  
        // Distance is the number of pixels to move the target so that its center
        // lines up with the center of the RecyclerView (mRecycler.getWidth() / 2)       
        int distance = targetCenter - mRecycler.getWidth() / 2;  
        return new int[]{distance, 0};  
    }  
};

किसी भी तरह काम करेगा।

5
Cheticamp 31 मई 2019, 23:44