2016-09-25 26 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的新类/接口吗?我做了一个无效的方法声明)。 –