2015-03-15 7 views
18

मेरे पास कुछ मूल आइटम सजावट है जो ItemDecoration.onDrawOver विधि में कुछ सामान खींचती है।आइटम एनीमेशन की अवधि के लिए रीसाइक्लर व्यू आइटम सजावट ड्राइंग को कैसे अक्षम करें

यह RecyclerView भी DefaultItemAnimator पर सेट है। एनिमेशन काम कर रहे हैं, सब बढ़िया है। एक चीज़ को छोड़कर।

जब सभी मौजूदा आइटम इस एडाप्टर में एक नए आइटम सेट के साथ बदल दिए जाते हैं, तो एनीमेशन चल रहा है, जबकि सजावट दिखायी जा रही है।

मुझे उन्हें छिपाने का एक तरीका चाहिए। जब एनीमेशन खत्म होता है, तो उन्हें दिखाया जाना चाहिए, लेकिन जब यह चल रहा है, तो उन्हें छिपाना होगा।

public void onDrawOver(..., RecyclerView.State state) { 
    if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) { 
     return; 
    } 
    // else do drawing stuff here 
} 

लेकिन यह मदद नहीं कर रहा है:

मैं निम्नलिखित की कोशिश की। सजावट केवल एनीमेशन की छोटी अवधि के लिए हटा दी जाती है, लेकिन फिर भी यह तब भी दिखाई देती है जब यह अभी भी चल रही है।

इसके अलावा सेटअप में RecyclerView.Adapter शामिल है जिसमें स्थिरता आईडी() (उस मामले में मामला है)।

उत्तर

24

यह एनीमेशन के प्रकार तुम पर कुछ हद तक निर्भर हो सकता है:

एक आइटम एनीमेशन के दौरान आइटम सजावट को छुपाने के लिए एक बस onDraw/onDrawOver में इस चेक का उपयोग कर सकते उपयोग कर रहे हैं, लेकिन कम से कम DefaultItemAnimator के लिए आपको एनीमेशन के दौरान एक्स/वाई अनुवाद करने के लिए खाते की आवश्यकता है। आप इन मानों को child.getTranslationX() और child.getTranslationY() के साथ प्राप्त कर सकते हैं।

उदाहरण के लिए, onDraw/onDrawOver के ऊर्ध्वाधर मामले के लिए: एनिमेशन के अन्य प्रकारों के लिए,:

private void drawVertical(Canvas c, RecyclerView parent) { 
    final int left = parent.getPaddingLeft(); 
    final int right = parent.getWidth() - parent.getPaddingRight(); 
    final int childCount = parent.getChildCount(); 
    final int dividerHeight = mDivider.getIntrinsicHeight(); 

    for (int i = 1; i < childCount; i++) { 
     final View child = parent.getChildAt(i); 
     final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 
     final int ty = (int)(child.getTranslationY() + 0.5f); 
     final int top = child.getTop() - params.topMargin + ty; 
     final int bottom = top + dividerHeight; 
     mDivider.setBounds(left, top, right, bottom); 
     mDivider.draw(c); 
    } 
} 

नोट (आप ViewCompat.getTranslationY(child) उपयोग करने के लिए यदि आप < एपीआई 11. समर्थन करने की आवश्यकता पसंद कर सकते हैं) अतिरिक्त समायोजन करने की आवश्यकता हो सकती है। (उदाहरण के लिए, क्षैतिज अनुवाद को भी जिम्मेदार ठहराया जा सकता है।)

7

मिले एक जवाब अपने आप:

public void onDrawOver(..., RecyclerView parent, ...) { 
    if(parent.getItemAnimator() != null && parent.getItemAnimator().isRunning()) { 
     return; 
    } 
    // else do drawing stuff here 
} 
+4

इस दृष्टिकोण का उपयोग सजावट को एक पल के लिए गायब होने का कारण बनता है और फिर एनीमेशन के बाद फिर से दिखाई देता है, जिसे मैंने सजावट को एनिमेट करने के रूप में अच्छा नहीं देखा। हालांकि, वैसे भी +1 करें क्योंकि 'getItemAnimator()। IsRunning() 'उपयोगी जानकारी है। :) –

+0

@LorneLaliberte हाँ, मैंने पाया कि दुर्भाग्यपूर्ण साइड इफेक्ट भी। यदि आपको चारों ओर एक रास्ता मिल रहा है, तो कृपया साझा करें ... – dimsuz

+0

एक ऐसे दृष्टिकोण के लिए मेरा उत्तर देखें जो सजावट को डिफ़ॉल्ट एनिमेशन के साथ एनिमेट करके हल करता है। –

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