2016-09-25 27 views
0

我有一個包含了報警數據的recyclerview:更新由AA刷卡幫手recyclerview數據(數組列表)

我帶來了數據在主片段上CreateView的是這樣的:

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

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

我還添加了一個刷卡助手來處理,當用戶掃描(丟棄)報警這樣的:

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

,並更新了回收觀點我在mainfragm有一個函數的數據(數組列表)耳鼻喉科更新這樣的:從主報警片段被調用的時候,所以我知道的功能是確定

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

此更新功能工作正常。

我的問題是功能需要,當用戶掃描發出警報,因爲它是需要從輕掃輔助類叫做:

我試圖使沒有工作得到了一個空指針報警靜態數組。

然後我試圖從輕掃助手這樣調用更新功能:

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

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

} 

但我又得到一個空指針異常。

如何更新數組並從滑動幫助器類調用notifydatasetchanged?

編輯:

這是刷卡助手在上刷卡被覆蓋(這是在自己的類文件):

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()); 


    } 
} 

這是調用適配器中駁回功能,但沒有引用創建Arraylist的主報警片段。

這是我的適配器電流的構造函數:

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; 
    } 

在此先感謝您的幫助

回答

2

這裏是更新的解決方案基礎上提供

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(); 
} 
} 

增加了一個額外的信息SwipeHelper類中的參數將保留需要更新的片段的引用。現在

你將不得不通過將片段參考

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

有了這兩個變化更新SwipeHelper的構造在MainFragment以及我希望你的問題得到解決。

+0

感謝您的回覆。在swiped被定義在它自己的類。對不起,如果我沒有把足夠的信息。我沒有看到我可以如何使用任何一種解決方案。我將用更多的代碼編輯我的問題。 –

+0

真棒謝謝!它完美地解決了問題。 –

1

您可以通過一些可以直接綁定到您的SwipeHelper或Adapter的界面來引用您的片段。

例如

interface AlarmDismissListener { 

    onAlarmDismissed(Alarm alarm); 
} 

和你的片段應該實現此接口

class AlarmsFragment extends Fragment implements AlarmDismissListener { 

//your code 

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

     update(); 
    } 

} 

變化的適配器

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)); 
    } 

} 

之後,你可以通過構造函數或設置此接口適配器二傳手。

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

@aelmil感謝您的回覆。我無法使您的解決方案正常工作。所以得到這個權利。你說的是創建一個名爲AlarmDismissListner的新類/接口嗎?我做了一個無效的方法聲明)。 –