2016-09-25 2 views
0

У меня есть recyclerview, который содержит данные для сигнализации:Обновление данных (ArrayList) для 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); 

и обновлять данные (ArrayList) для представления ресайклера у меня есть функция в 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(); 

} 

Но опять-таки я получаю исключение нулевого указателя.

Как обновить массив и вызвать notifydatas выбрано из класса помощников салфетки?

EDIT:

Это является помощником коромысло, где на прокатывается переопределяется (он находится в своем собственном файле класса):

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, который сохранит ссылку на фрагмент, который необходимо обновить.

Теперь вы должны обновить конструктор SwipeHelper в вашем MainFragment, а также путем передачи опорного фрагментировать

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

С помощью этих двух изменений, которые я надеюсь, что ваша проблема получает решена.

+0

благодарит за ваш ответ. На swiped определяется в своем классе. Извините, если я не разместил достаточно информации. Я не вижу, как я могу использовать любое решение. Я отредактирую свой вопрос с большим количеством кода. –

+0

Awesome Спасибо! Это сработало отлично, устраняя проблему. –

1

Вы можете сделать ссылку на свой фрагмент через какой-либо интерфейс, который может быть связан непосредственно с вашим SwipeHelper или адаптером.

, например

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

} 

После этого вы можете установить этот интерфейс к адаптеру через конструктор или сеттер.

+0

@aelmil Спасибо за ваш ответ. У меня проблемы с решением проблемы. Итак, чтобы все было правильно. Вы говорите, что создаете новый класс/интерфейс под названием AlarmDismissListner. Это и я получаю недопустимое объявление метода). –

Смежные вопросы