从刷卡助手更新Recyclerview的数据(Arraylist)

时间:2016-09-25 02:01:44

标签: android arraylist android-recyclerview

我有一个包含警报数据的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;
    }

提前感谢您的帮助

2 个答案:

答案 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);