2015-06-16 7 views
11

मैं अपने रीसाइक्लर व्यू के लिए स्वाइप सक्षम करने के लिए अपने एंड्रॉइड एप्लिकेशन के लिए स्वाइप करने योग्य रीसाइक्लिंग व्यू का उपयोग कर रहा हूं। RecyclerView में कार्ड व्यू की एक सूची है।RecyclerView.getChild (अनुक्रमणिका) सूची स्क्रॉल होने पर शून्य दिखाई देती है (इंडेक्स गड़बड़ हो जाता है)

मैं जब बाईं ओर स्वाइप करें (प्रथम कड़ी चोट शो पूर्ववत, अगले कड़ी चोट हटाना उत्पन्न करते हैं)

मैं निम्नलिखित कोड कोशिश कर रहा हूँ (आंशिक रूप से काम कर मुझे लगता है) कार्ड के लिए पूर्ववत कार्यक्षमता जो हटाया नहीं जाएगा लागू करने के लिए कोशिश कर रहा था

SwipeableRecyclerViewTouchListener srvTouchListner = new SwipeableRecyclerViewTouchListener(rvTimerList, 
      new SwipeableRecyclerViewTouchListener.SwipeListener(){ 

       @Override 
       public boolean canSwipe(int i) { 
        return true; 
       } 

       @Override 
       public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] ints) { 
        for(int position : ints){ 
         View view = recyclerView.getChildAt(position); 
          if (view.getTag(R.string.card_undo) == null) { 
           if(viewStack == null) { 
            saveToViewStack(position, view); 
            final ViewGroup viewGroup = (ViewGroup) view.findViewById(R.id.time_card2); 
            view.setTag(R.string.card_undo, "true"); 
            viewGroup.addView(view.inflate(TimerSummary.this, R.layout.timeslot_card_undo, null)); 
           } 
          } else { 
           Log.d(TAG, "Removing Item"); 
           deleteTimeSlot(timerInstanceList.get(position)); 
           Toast.makeText(TimerSummary.this, "Deleted!", Toast.LENGTH_SHORT).show(); 
           timerInstanceList.remove(position); 
           finalSummaryAdapter.notifyItemRemoved(position); 
          } 

        } 
        finalSummaryAdapter.notifyDataSetChanged(); 
       } 
       @Override 
       public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] ints) { 
        for (int position:ints){ 
         View view = recyclerView.getChildAt(position); 
         if(view.getTag(R.string.card_undo) != null && view.getTag(R.string.card_undo).equals("true")){ 
          viewStack = null; 
          recyclerView.setAdapter(finalSummaryAdapter); 
         } 
        } 

       } 
      }); 

आइटम अधिक (स्क्रॉल जरूरतों)

View view = recyclerView.getChildAt(position); 

एक अशक्त संदर्भ, जिसके लिए ऐप्लिकेशन दुर्घटना का कारण बनता है देता है होते हैं।

मुझे संदेह है कि मैं देखने के लिए गलत विधि का उपयोग कर रहा हूं। मुझे व्यूहोल्डर से संबंधित कुछ का उपयोग करना चाहिए, मैं वास्तव में इस तरह के भ्रमित हूं कि व्यूहोल्डर से जो दृश्य आप चाहते हैं उसे प्राप्त करने के लिए।

यदि कोई भी मदद करता है जो कुछ भी साझा कर सकता है, तो यह बहुत अच्छा होगा! अगर कोई इसे चाहता है तो मुझे कोई और जानकारी प्रदान करने में खुशी होगी,

उत्तर

17

आपको findViewHolderForAdapterPosition का उपयोग करना चाहिए। https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)

ध्यान रखें कि यदि स्थिति निर्धारित नहीं की जाती है तो यह शून्य हो जाएगी (उदा। सीमाओं या हटाए गए)।

+1

मैं इस व्यूअरधारक से किसी भी विचार को कैसे एक्सेस करूं, क्या मैं लेआउट बदल सकता हूं और एक नया फुला सकता हूं? –

+0

वैसे भी मैं एक कार्डव्यू का उपयोग कर रहा हूं जो पहली बार छुपा हुआ है जब उपयोगकर्ता किसी आइटम को हटाने का प्रयास करता है, इस तरह मैं रीसाइक्लिंग व्यू से सीधे दृश्यों तक पहुंचने का प्रयास करते समय गड़बड़ी से बच सकता हूं।यह ठीक काम कर रहा है, मैं इस अवधारणा का उपयोग तब तक करूँगा जब तक कि मैं रीसाइक्लर से दृश्यमान रूप से विचार नहीं कर पाता हूं –

+0

@yigit क्या आप थोड़ा और विस्तार कर सकते हैं? आपने कहा था कि "इसका उपयोग करना चाहिए ..."। क्या यह अपेक्षित व्यवहार या बग है? (क्यूं कर?)। मैं RecyclerView को स्क्रोल करने योग्य दृश्य के रूप में देखता हूं, इसलिए यदि आप मुझसे पूछें तो यह थोड़ा अजीब है। – GMan

8

चूंकि मेरे पास @ यिजिट के उत्तर पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा अंक नहीं हैं, इसलिए मैंने सोचा कि मैं सभी दृश्यों को पुनर्प्राप्त करने का एक तरीका दूंगा, जो कि वर्तमान में व्यू ग्रुप में मौजूद है, इस पर ध्यान दिए बिना। यहां तक ​​कि findViewHolderForAdapterPosition और ForLayoutPosition के साथ भी हम RecyclerView में ViewHolder का एक शून्य उदाहरण प्राप्त कर सकते हैं।

इस दरकिनार करने के लिए, हम findViewHolderForItemId उपयोग कर सकते हैं [] और का उपयोग कर अनुकूलक में viewHolder की आईडी पारित RecyclerView.Adapter # getItemId (पूर्णांक स्थिति) []

for (int i = 0; i < mAdapter.getItemCount(); i++) { 
    RecyclerView.ViewHolder holder = 
      mRecyclerView.findViewHolderForItemId(mAdapter.getItemId(i)); 
} 
  1. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForItemId(int)
  2. https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#getItemId(int)
+0

यह एक दिलचस्प जवाब है। मैंने कोशिश की और पाया कि findViewHolderForItemId (int) सिर्फ एक int स्थिति चाहता है, न कि लंबे समय तक ITemId (int) देता है। – Gi0rgi0s

0

च उपयोग indFirstCompletelyVisibleItemPosition() & FindLastVisibleItemPosition() आपके रीसाइक्लिंग के लेआउटमैनेजर पर विधियों को देखने के लिए देखें कि जिस बच्चे को आप ढूंढ रहे हैं वह दृश्यमान है या नहीं। यदि यह दिखाई दे रहा है तो आप उस विशेष बच्चे के व्यूहोल्डर उदाहरण प्राप्त करने के लिए GetChild (अनुक्रमणिका) का उपयोग कर सकते हैं और यह शून्य नहीं होगा, यह शून्य हो सकता है (यदि बच्चा इसमें नहीं है)। यदि आपका बच्चा दिखाई नहीं दे रहा है तो आप अपनी विशिष्ट स्थिति सूची ऑब्जेक्ट में बदलाव कर सकते हैं, अगली बार जब भी यह दिखाई देगा, तो यूआई अपडेट किया जाएगा।

if (selectedPosition >= linearLayoutManager.findFirstVisibleItemPosition() 
        && selectedPosition <= linearLayoutManager.findLastVisibleItemPosition()){ 
        linearLayoutManager.getChildAt(selectedPosition).setBackgroundResource(0); 
       } 
संबंधित मुद्दे