2016-09-25 2 views
0

Ich habe einen recyclerview, die Daten für Alarme enthält:Aktualisierung der Daten (Arraylist) für recyclerview von aa Swipe Helfer

ich im Haupt Fragment auf Create wie dies in den Daten bringen:

// Data 
alarms = AlarmCollection.getAlarms(getActivity()); 

// Adapter 
adapter = new AlarmsAdapter(getActivity(), alarms); 
rv.setAdapter(adapter); 

ich füge auch einen Seitenhieb Helfer zu handhaben, wenn ein Benutzer klaut (verwirft) einen Alarm wie folgt aus:

// Swipe helper 
ItemTouchHelper.Callback callback = new SwipeHelper(adapter); 
ItemTouchHelper helper = new ItemTouchHelper(callback); 
helper.attachToRecyclerView(rv); 

und die Daten (Arraylist) für die Recycler Ansicht ich eine Funktion in der mainfragm haben zu aktualisieren ent für wie diese Aktualisierung:

public void update(){ 
    alarms.clear(); 
    alarms.addAll(AlarmCollection.getAlarms(getActivity())); 
    adapter.notifyDataSetChanged(); 
} 

Dieses Update-Funktion funktioniert gut, wenn von dem Hauptalarm-Fragmente genannt wird, damit ich die Funktion ist ok wissen.

Mein Problem ist, dass Funktion aus der Swipe-Helper-Klasse aufgerufen werden muss, wie es benötigt wird, wenn der Benutzer einen Alarm klaut aus:

ich die Alarme Array statisch zu machen versucht, die einen Null-Zeiger nicht bekam arbeiten .

Dann habe ich versucht, wie dies die Update-Funktion aus dem Swipe-Helfer Aufruf:

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 

    AlarmsFragment = new MainAlarmsFragment(); 
    adapter.dismissAlarm(viewHolder.getAdapterPosition()); 
    AlarmsFragment.update(); 

} 

Aber wieder erhalte ich eine Null-Zeiger-Ausnahme.

Wie aktualisiere ich das Array und call notifydatasetchanged von der Swipe-Helper-Klasse?

EDIT:

Dies ist der Swipe-Helfer, wo die auf geklaut außer Kraft gesetzt werden (es ist in seiner eigenen Klasse-Datei):

public class SwipeHelper extends ItemTouchHelper.SimpleCallback { 

    AlarmsAdapter adapter; 

    public SwipeHelper(int dragDirs, int swipeDirs) { 
     super(dragDirs, swipeDirs); 
    } 

    public SwipeHelper(AlarmsAdapter adapter) { 
     super(ItemTouchHelper.UP | ItemTouchHelper.DOWN,ItemTouchHelper.RIGHT |ItemTouchHelper.LEFT); 
     this.adapter = adapter; 
    } 


    @Override 
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 

      adapter.dismissAlarm(viewHolder.getAdapterPosition()); 


    } 
} 

Dies ist die Funktion im Adapter entlassen Aufruf hat aber keine Verweis auf das Hauptalarmfragment, in dem die Arraylist erstellt wird.

Dies ist mein aktueller Konstruktor für den Adapter:

public class AlarmsAdapter extends RecyclerView.Adapter<AlarmHolder>{ 
    Context c; 
    ArrayList <Alarm> alarms; 

    ArrayList <Integer> alarmsIdsArray; 

    public AlarmsAdapter(Context c, ArrayList<Alarm> alarms) { 
     this.c = c; 
     this.alarms = alarms; 
    } 

Vielen Dank im Voraus für Ihre Hilfe

Antwort

2

Hier wird die aktualisierte Lösung auf der Grundlage der bereitgestellten Informationen

public class SwipeHelper extends ItemTouchHelper.SimpleCallback { 
    AlarmsAdapter adapter; 
    MainAlarmsFragment fragment; 

public SwipeHelper(int dragDirs, int swipeDirs) { 
    super(dragDirs, swipeDirs); 
} 

public SwipeHelper(MainAlarmsFragment fragment, AlarmsAdapter adapter) { 
    super(ItemTouchHelper.UP | ItemTouchHelper.DOWN,ItemTouchHelper.RIGHT |ItemTouchHelper.LEFT); 
    this.fragment = fragment; 
    this.adapter = adapter; 
} 


@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
    adapter.dismissAlarm(viewHolder.getAdapterPosition()); 
    fragment.update(); 
} 
} 

Added extra Argument in der SwipeHelper-Klasse, das die Referenz des Fragments enthält, das aktualisiert werden muss.

Jetzt werden Sie auch den Konstruktor von SwipeHelper in Ihrem MainFragment aktualisieren müssen durch das Fragment Referenz

// Swipe helper 
ItemTouchHelper.Callback callback = new SwipeHelper(this, adapter); 
ItemTouchHelper helper = new ItemTouchHelper(callback); 
helper.attachToRecyclerView(rv); 

Mit diesen beiden Änderungen vorbei Ich hoffe, Ihr Problem behoben wird.

+0

danke für Ihre Antwort. On swiped ist in einer eigenen Klasse definiert. Tut mir leid, wenn ich nicht genug Informationen dort hingelegt habe. Ich sehe nicht, wie ich beide Lösungen verwenden kann. Ich werde meine Frage mit mehr Code bearbeiten. –

+0

Super Danke! Es hat sofort funktioniert und das Problem behoben. –

1

Sie können einen Verweis auf Ihr Fragment über eine Schnittstelle erstellen, die direkt an Ihren SwipeHelper oder Adapter gebunden werden kann.

zum Beispiel

interface AlarmDismissListener { 

    onAlarmDismissed(Alarm alarm); 
} 

und Ihr Fragment sollte diese Schnittstelle

class AlarmsFragment extends Fragment implements AlarmDismissListener { 

//your code 

    public void onAlarmDismissed(Alarm alarm) { 
     //your code 

     update(); 
    } 

} 

Änderungen für Adapter implementieren

class AlarmAdapter extends RecyclerView.Adapter { 

    // your code 

    // new field for your listener 
    AlarmDismissListener dismissListener; 

    //setter 
    public void setDismissListener(AlarmDismissListener dismissListener) { 
    this.dismissListener = dismissListener; 
    } 


    //invoke the listener method in method 
    public void dismissAlarm(int position) { 
     //your code 

     dismissListener.onAlarmDismissed(alarms.get(position)); 
    } 

} 

Danach können Sie diese Schnittstelle an Ihren Adapter durch Konstruktor festgelegt oder Setter.

// Adapter 
adapter = new AlarmsAdapter(getActivity(), alarms); 
adapter.setDismissListener(this); 
rv.setAdapter(adapter); 
+0

@aelmil Vielen Dank für Ihre Antwort. Ich habe Probleme, Ihre Lösung zum Laufen zu bringen. Also, um das richtig zu machen. Sie sagen, erstellen Sie eine neue Klasse/Schnittstelle namens AlarmDismissListner Did, und ich bekomme ungültige Methode Erklärung). –

Verwandte Themen