2016-09-25 12 views
0

からrecyclerviewのためのデータ(のArrayListを)更新:は、私はアラームのデータが含まれているrecyclerviewを持つAAスワイプヘルパー

私はこのような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で機能を持つリサイクルビューのデータ(配列リスト)を更新する:私はまた、ユーザーがスワイプすると、このように処理するためにアラームを(破棄)をスワイプヘルパーを追加します

このアップデート機能は、メインアラームフラグメントから呼び出されたときに正常に機能するので、機能は正常です。

私の問題は、その機能は、ユーザーがアラームをオフにスワイプするとき、それが必要とされてスワイプヘルパークラスから呼び出す必要がある:

私は仕事がNULLポインタを持っていなかったアラームアレイ静的を作ってみました。

は、それから私はこのようなスワイプヘルパーから更新関数を呼び出してみました:

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

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

} 

しかし、再び、私は、nullポインタ例外を取得します。

スワイプヘルパークラスから配列を更新し、notifydatasetchangedを呼び出すにはどうすればよいですか?

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クラスの引数。

今、あなたは私があなたの問題が解決さ願うこれら二つの変更によりフラグメント参照に

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

を渡すことによって、同様にあなたのMainFragmentにSwipeHelperのコンストラクタを更新する必要があります。

+0

ご回答いただきありがとうございます。オンスワイプは独自のクラスで定義されています。申し訳ありませんが、私はそこに十分な情報を入れていませんでした。私はどちらのソリューションをどのように使うことができないのか分かりません。より多くのコードで質問を編集します。 –

+0

恐ろしいありがとう!それは完璧に直ちに問題を解決しました。 –

1

あなたのSwipeHelperまたはアダプタに直接バインドできるインターフェイスを使用して、フラグメントへの参照を作成することができます。

interface AlarmDismissListener { 

    onAlarmDismissed(Alarm alarm); 
} 

ため

とあなたのフラグメントを使用すると、コンストラクタまたはを通して、あなたのアダプタにこのインターフェイスを設定することができます。その後、アダプタ

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

} 

ため

class AlarmsFragment extends Fragment implements AlarmDismissListener { 

//your code 

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

     update(); 
    } 

} 

変更、このインタフェースを実装する必要がありますセッター。

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

@aelmilご回答いただきありがとうございます。私はあなたのソリューションを動作させるのに問題があります。だからこの権利を得る。あなたはAlarmDismissListnerと呼ばれる新しいクラス/インタフェースを作成すると言っていますが、それは無効なメソッド宣言を取得しています)。 –

関連する問題