2016-08-18 10 views
5

सबसे पहले, मैंने पूरे दिन इस पर काम किया लेकिन कुछ भी नहीं किया जा सका। मेरे पास RecyclerView एक एडाप्टर है जो RecyclerView के SortedList का उपयोग करता है। इंटरफ़ेस OnItemChangeListenerसूचित करें ItemChanged रीफ्रेशिंग दृश्य

@Override 
public void onItemSwiped(int position) { 
    notifyItemChanged(position); 
    removalPendingTimers.add(timerList.get(position)); 
} 

मेरे ViewHolder पढ़ता राज्य और जब लागू

public class TimerListTouchHelperCallback extends ItemTouchHelper.SimpleCallback { 

    private OnItemChangeListener onItemChangeListener; 

    public TimerListTouchHelperCallback(OnItemChangeListener listener, int dragDirs, int swipeDirs) { 
     super(dragDirs, swipeDirs); 

     this.onItemChangeListener = listener; 

    } 

    @Override 
    public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
     TimerHolder holder = (TimerHolder) viewHolder; 

     int holderState = holder.getState(); 

     if (holderState == TimerHolder.TIMER_PENDING_DELETE) return 0; 
     else return super.getSwipeDirs(recyclerView, viewHolder); 
    } 

    @Override 
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
     return false; 
    } 




    @Override 
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { 
     TimerHolder holder = (TimerHolder) viewHolder; 

     int position = holder.getAdapterPosition(); 
     // ViewHolder's state is changed that should handle the layout change. 
     holder.setState(TimerHolder.TIMER_PENDING_DELETE); 

     if (onItemChangeListener != null) onItemChangeListener.onItemSwiped(position); 
    } 


    protected interface OnItemChangeListener{ 
     void onItemSwiped(int position); 
    } 
} 

यहाँ TouchHelper

timerAdapter = new TimerAdapter(this, timerList); 
    timerListView.setAdapter(timerAdapter); 

TimerListTouchHelperCallback touchHelperCallback = new TimerListTouchHelperCallback(
     timerAdapter, 
     ItemTouchHelper.LEFT, 
     ItemTouchHelper.LEFT); 

ItemTouchHelper swipeToDismissTouchHelper = new ItemTouchHelper(touchHelperCallback); 

swipeToDismissTouchHelper.attachToRecyclerView(timerListView); 

मेरे एडाप्टर के प्रारंभ है: मैं कॉलबैक वर्ग के साथ TouchHelper को लागू करने की कोशिश की राज्य TimerHolder.TIMER_PENDING_DELETE है यह बाकी दृश्य को छुपाता है और इंटरफ़ेस को एक un के साथ दिखाता है बटन करो लेकिन यह तब तक नहीं हो रहा है जब तक कि मैं दृश्य को स्क्रॉल नहीं करता और इसे फिर से स्क्रॉल नहीं करता। कोई सुझाव जो मुझे याद आ रहा है?

Problem case

लिंक

Adapter class ViewHolder class

+0

क्या आपको आइटम को स्वाइप किए जाने पर आइटम को हटाया जाना चाहिए और फिर एडाप्टर को सूचित करना चाहिए? –

+0

'OnItemSwiped' बाद में आइटम को हटाने के लिए एक हैंडलर को कॉल करेगा, जैसे जीमेल ऐप में। –

+0

मैंने कोड अपडेट किया है। –

उत्तर

1

मैं एक साधारण उदाहरण Android एप्लिकेशन बना लिया है बेहतर प्रश्न को समझने के लिए।

यह का उपयोग करता है सूचित करें ItemChanged (स्थिति); जब उपयोगकर्ता पूर्व देखें दिखाने के लिए आइटम को बाएं या दाएं स्वाइप करता है। जब पूर्ववत समय समाप्त हो जाता है तो यह को सूचित करता है सूचित करें (स्थिति) सूची से इसे हटाने के लिए। उदाहरण के लिए जीआईएफ देखें, कोई खाली पंक्ति नहीं छोड़ती है।

https://github.com/DawidvanGraan/ExampleRecycleViewSwipeDismiss

+0

मैंने कोड अपडेट किया है। –

+0

मैं कल रात पूरी तरह से कोड देख रहा था, और ऐसा लगता है कि रीसाइक्लिंग और एडाप्टर के कार्यान्वयन में कुछ गड़बड़ है और TouchHelperClass के साथ नहीं –

1

अंत में चल रहा है यह मिल गया। चूंकि notifyItemChanged इसे काट नहीं रहा था (जो यह होना चाहिए), मैंने notifyItemRemoved का उपयोग किया जिसके बाद notifyItemInserted था।

बस थोड़ा सा काम करता है लेकिन काम करता है।

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