10

मेरे पास एक एकल वर्टिकल नेस्टड्सक्रॉलव्यू है जिसमें एक क्षैतिज लेआउटमैनेजर सेटअप के साथ रीसाइक्लिंगव्यू का एक गुच्छा है। विचार यह है कि नया Google play store कैसा दिखता है। मैं इसे कार्यात्मक बनाने में सक्षम हूं लेकिन यह बिल्कुल आसान नहीं है। यहां समस्याएं हैं:NestedScrollView और क्षैतिज पुनर्चक्रण देखें चिकना स्क्रॉलिंग

1) क्षैतिज पुनर्नवीनीकरण आइटम अधिकांश बार टच ईवेंट को रोकने में विफल रहता है, भले ही मैं इसे सही टैप करता हूं। अधिकांश गतियों के लिए स्क्रॉल व्यू को प्राथमिकता दी जाती है। क्षैतिज गति पर एक हुक प्राप्त करना मेरे लिए मुश्किल है। यह यूएक्स निराशाजनक है क्योंकि मुझे काम करने से पहले कुछ बार कोशिश करने की ज़रूरत है। यदि आप प्ले स्टोर की जांच करते हैं, तो यह स्पर्श ईवेंट को वास्तव में अच्छी तरह से रोक सकता है और यह ठीक से काम करता है। मैंने प्ले स्टोर में देखा है कि जिस तरह से वे इसे सेट करते हैं, वह एक लंबवत रीसाइक्लर्विव के अंदर कई क्षैतिज रीसाइक्लिंगव्यू है। कोई स्क्रॉलव्यू नहीं

2) क्षैतिज पुनर्नवीनीकरण की ऊंचाई मैन्युअल रूप से सेट की जानी चाहिए और बच्चों के तत्वों की ऊंचाई की गणना करने का कोई आसान तरीका नहीं है।

<android.support.v4.widget.NestedScrollView 
    android:id="@+id/scroll" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clipToPadding="false" 
    android:background="@color/dark_bgd" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <LinearLayout 
      android:id="@+id/main_content_container" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:visibility="gone" 
      tools:visibility="gone" 
      android:orientation="vertical">     

       <android.support.v7.widget.RecyclerView 
        android:id="@+id/starring_list" 
        android:paddingLeft="@dimen/spacing_major" 
        android:paddingRight="@dimen/spacing_major" 
        android:layout_width="match_parent" 
        android:layout_height="180dp" /> 

यह यूआई पैटर्न बहुत ही बुनियादी है और सबसे अधिक संभावना कई अलग अलग ऐप्लिकेशन में उपयोग:

यहाँ लेआउट मैं उपयोग कर रहा हूँ है। मैंने कई एसओ पढ़े हैं जहां पीपीएल कहता है कि सूची में एक सूची डालना एक बुरा विचार है, लेकिन यह एक बहुत ही आम और आधुनिक यूआई पैटर्न है जो पूरे स्थान पर उपयोग किया जाता है। नेटफ्लिक्स की तरह इंटरफ़ेस जैसे क्षैतिज स्क्रॉल सूचियों की एक श्रृंखला के साथ इंटरफ़ेस की तरह एक लंबवत सूची। क्या इसे पूरा करने का कोई आसान तरीका नहीं है? दुकान से

उदाहरण छवि:

Google Play Store

+0

अजीब बात यह है कि मेरे पास विपरीत समस्या है: मैं NestedScrollView को लंबवत स्क्रॉल करने की अनुमति देना चाहता हूं, लेकिन क्षैतिज पुनर्चक्रण दृश्य स्पर्श घटनाओं को लेता है, इसलिए जब मैं उस पर लंबवत स्क्रॉलिंग शुरू करता हूं, तो यह इसकी अनुमति नहीं देता है। इसके अलावा, अगर आपके पास दिखाने के लिए कुछ आइटम हैं, तो आप LinearLayout के साथ एक साधारण क्षैतिज स्क्रॉलव्यू का उपयोग कर सकते हैं। –

उत्तर

13

पर एक निश्चित ऊंचाई प्रदान करनी होगी ताकि चिकनी स्क्रॉलिंग समस्या अब तय हो। यह डिजाइन समर्थन पुस्तकालय (वर्तमान में 23.1.1) में NestedScrollView में एक बग के कारण हुआ था।

आप इस मुद्दे को और यहाँ सरल निदान के बारे में पढ़ सकते हैं: https://code.google.com/p/android/issues/detail?id=194398

संक्षेप में, आप एक फ़्लिंग प्रदर्शन के बाद, nestedscrollview स्क्रोलर घटक पर एक पूरा पंजीकृत नहीं किया है और इसलिए यह एक अतिरिक्त 'की जरूरत ACTION_DOWN 'ईवेंट को बाद की घटनाओं में हस्तक्षेप (खाने) से पैरेंट नेस्टड्सक्रॉलव्यू जारी करने के लिए। तो क्या हुआ अगर आप अपने बच्चे की सूची (या व्यूपार्जर) को फ़्लिंग करने के बाद स्क्रॉल करने का प्रयास करते हैं, तो पहला स्पर्श माता-पिता एनएसवी बांध को जारी करता है और बाद के स्पर्श काम करेंगे। वह यूएक्स वास्तव में खराब बना रहा था।

मूलतः एनएसवी की ACTION_DOWN घटना पर इस लाइन जोड़ने की जरूरत:

computeScroll(); 

यहाँ मैं क्या उपयोग कर रहा हूँ है:

public class MyNestedScrollView extends NestedScrollView { 
private int slop; 
private float mInitialMotionX; 
private float mInitialMotionY; 

public MyNestedScrollView(Context context) { 
    super(context); 
    init(context); 
} 

private void init(Context context) { 
    ViewConfiguration config = ViewConfiguration.get(context); 
    slop = config.getScaledEdgeSlop(); 
} 

public MyNestedScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public MyNestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(context); 
} 


private float xDistance, yDistance, lastX, lastY; 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    final float x = ev.getX(); 
    final float y = ev.getY(); 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 

      // This is very important line that fixes 
      computeScroll(); 


      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 

      if (xDistance > yDistance) { 
       return false; 
      } 
    } 


    return super.onInterceptTouchEvent(ev); 
} 

}

जगह में इस वर्ग का प्रयोग करें xml फ़ाइल में अपने nestedscrollview के, और बाल सूचियों को स्पर्श घटनाओं को ठीक से रोकना और संभालना चाहिए।

पुhew, वास्तव में ऐसी कुछ चीजें हैं जो मुझे डिज़ाइन समर्थन लाइब्रेरी को पूरी तरह से मिटाना चाहती हैं और इसे अधिक परिपक्व होने पर पुन: संशोधित करती हैं।

+0

यह काम किया! धन्यवाद! – Sam

1

मैं एक ViewPager के साथ एक खड़ी स्क्रॉल माता-पिता में क्षैतिज स्क्रॉल करने में succeded है:

<android.support.v4.widget.NestedScrollView 

    ... 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager_known_for" 
     android:layout_width="match_parent" 
     android:layout_height="350dp" 
     android:minHeight="350dp" 
     android:paddingLeft="24dp" 
     android:paddingRight="24dp" 
     android:clipToPadding="false"/> 

सार्वजनिक वर्ग UniversityKnownForPagerAdapter फैली PagerAdapter {

public UniversityKnownForPagerAdapter(Context context) { 
    mContext = context; 
    mInflater = LayoutInflater.from(mContext); 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    View rootView = mInflater.inflate(R.layout.card_university_demographics, container, false); 

    ... 

    container.addView(rootView); 

    return rootView; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    container.removeView((View)object); 
} 

@Override 
public int getCount() { 
    return 4; 
} 

@Override 
public boolean isViewFromObject(View view, Object object) { 
    return (view == object); 
} 

केवल समस्या: आपको दृश्य पेजर

+0

आपके उत्तर के लिए धन्यवाद। मैंने आपके समाधान की भी कोशिश की और दर्शक को काम करने और स्क्रॉल करने के लिए मिला, लेकिन ऊपर वर्णित वही स्क्रॉलिंग समस्याएं भी यहां हुईं। फिक्स के लिए मेरा जवाब देखें। – falc0nit3

+0

क्या आपने रीसाइक्लर्विव के बजाय व्यूपर के साथ प्रयास किया था? –

+0

मैंने किया, यह अभी भी घटनाओं को बहुत अच्छी तरह से रोक नहीं रहा था। समस्या बच्चे सूची कार्यान्वयन (रीसाइक्लर्विव/व्यूपार्जर/क्षैतिज लिस्ट व्यू इत्यादि) के साथ नहीं है, मुझे लगता है, बल्कि NestedScrollView लाइब्रेरी। (जैसा कि मैंने ऊपर दिए गए मेरे उत्तर में उल्लेख किया है) – falc0nit3

संबंधित मुद्दे