我有一个包含警报数据的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);
为了更新Recycler视图的数据(arraylist),我在mainfragment中有一个函数用于更新,如下所示:
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());
}
}
这是调用适配器中的dismiss函数,但没有引用创建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;
}
提前感谢您的帮助
答案 0 :(得分: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类中添加了一个额外的Argument,它将保留需要更新的Fragment的引用。
现在你必须通过传递片段引用来更新MainFragment中SwipeHelper的构造函数
// Swipe helper
ItemTouchHelper.Callback callback = new SwipeHelper(this, adapter);
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(rv);
通过这两项更改,我希望您的问题得到解决。
答案 1 :(得分: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));
}
}
之后,您可以通过构造函数或setter将此接口设置为适配器。
// Adapter
adapter = new AlarmsAdapter(getActivity(), alarms);
adapter.setDismissListener(this);
rv.setAdapter(adapter);