2017-04-17 3 views
5

जोड़ा जाता है, औरrecycleview में Diffutil, यह autoscroll अगर हम <code>DiffUtil.Callback</code> का उपयोग करता है, तो एक नया आइटम

adapter.setItems(itemList); 
diff.dispatchUpdatesTo(adapter); 

कर हम कैसे सुनिश्चित करें कि नए तत्व के कहा कि नई स्थिति पर स्क्रॉल करेगा कर सकते हैं बना रही है।

मेरे पास एक ऐसा मामला है जहां मैं आइटम गायब हो जाता हूं, और एक नया शीर्ष पर पहले तत्व के रूप में बनाया जाता है, लेकिन दिखाई नहीं देता है। जब तक आप इसे दृश्यमान बनाने के लिए नीचे स्क्रॉल नहीं करते हैं तब तक यह शीर्ष पर छिपा हुआ है। DiffUtil का उपयोग करने से पहले, मैं इसे मैन्युअल रूप से कार्यान्वित कर रहा था, और मुझे पता था कि मैं कुछ स्थिति (शीर्ष पर) में डालने वाला था, मैं स्क्रॉल कर सकता था।

+1

बस आइटम जोड़ें और 'RecyclerView.scrollToPosition (int position)' का उपयोग करें। काम किया जब मुझे यह करना पड़ा, यहां तक ​​कि डिफ्यूट के साथ भी। –

उत्तर

7

आपके पास dispatchUpdatesTo(ListUpdateCallback) विधि भी उपयोग करने के लिए है।

तो आप बस को लागू कर सकता है एक ListUpdateCallback जो आप पहले तत्व देता है

class MyCallback implements ListUpdateCallback { 
    int firstInsert = -1; 
    Adapter adapter = null; 
    void bind(Adapter adapter) { 
     this.adapter = adapter; 
    } 
    public void onChanged(int position, int count, Object payload) { 
     adapter.notifyItemRangeChanged(position, count, payload); 
    } 
    public void onInserted(int position, int count) { 
     if (firstInsert == -1 || firstInsert > position) { 
      firstInsert = position; 
     } 
     adapter.notifyItemRangeInserted(position, count); 
    } 
    public void onMoved(int fromPosition, int toPosition) { 
     adapter.notifyItemMoved(fromPosition, toPosition); 
    } 
    public void onRemoved(int position, int count) { 
     adapter.notifyItemRangeRemoved(position, count); 
    } 
} 

डाला और फिर बस RecyclerView मैन्युअल स्क्रॉल

myCallback.bind(adapter) 
adapter.setItems(itemList); 
diff.dispatchUpdatesTo(myCallback); 
recycler.smoothScrollToPosition(myCallback.firstInsert); 
+0

नोट: यह पहली स्थिति तक स्क्रॉल करेगा भले ही शुरुआत पहले दिखाई न दे। एक बेहतर यूएक्स के लिए आपको उपयोगकर्ता की वर्तमान स्क्रॉल स्थिति को संरक्षित करने का प्रयास करना चाहिए, और केवल शुरुआत से स्क्रॉल करें यदि अद्यतन से पहले दृश्य दिखाई दे रहा था। –

+0

साझा करने के लिए धन्यवाद! – Sevastyan

+0

@LorneLaliberte क्या आप अपने सुझाव के लिए कोड उदाहरण प्रदान कर सकते हैं? मुझे लगता है कि यह सबसे अच्छा समाधान होगा – Konrad

9

एक आसान तरीका भी यह है कि यह भी बरकरार रखता है क्या करना है यदि उपयोगकर्ता देखने योग्य क्षेत्र के बाहर आइटम डाले गए हैं तो उपयोगकर्ता की स्क्रॉल स्थिति:

import android.os.Parcelable; 

Parcelable recyclerViewState = recyclerView.getLayoutManager().onSaveInstanceState(); 
// apply diff result here (dispatch updates to the adapter) 
recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);    

इस दृष्टिकोण का उपयोग करते हुए, नए आइटम दृश्यमान होते हैं यदि वे डाले जाते हैं जहां उपयोगकर्ता उन्हें देख सकता है - लेकिन उपयोगकर्ता के दृष्टिकोण को संरक्षित किया जाता है यदि आइटम दृश्य के बाहर डाले जाते हैं।

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