0

私はタブで3つのフラグメントを持つアクティビティを持っています。そのうちの1つは "TaskFragment"と呼ばれています。DialogFragmentの後のフラグメント内のリフレッシュアダプタdbflow insert

私の主なアクティビティでは、フラグメントをロードするだけです。 TaskFragmentでは、私は正常に動作しているRecyclerViewを持ち、意図したとおりにアイテムを表示しています。

問題は、DialogFragmentを使用してデータを挿入すると、DbFlow ORMを使用してデータを挿入するためですが、DetailMainActivity内のTaskFragmentフラグメントにあるため、アダプタをリフレッシュしません私が言ったように活動。

私は、アダプタをリフレッシュするためにonResume()とonPause()を使用しようとしましたが、アクティビティが一時停止しないため、またはDialogFragmentのonresumeで呼び出されません。

私もインターフェイスを使用しようとしましたが、うまく動作せず、私はstackoverflowとgoogleを一切検索しませんでした。

あなたがよりよく理解して私はここに私のコードの一部を残す:

DetailMainActivity.java ここでのonClickインターフェイスで私が入力したユーザ情報にDialogFragmentを示しました。このフラグメントでTaskFragment.java

FragmentManager fm = getSupportFragmentManager(); 
       AddSimpleTask sptask = new AddSimpleTask(); 
       sptask.show(fm, "tag"); 

は、私は私のRecyclerView

private void setupRecyclerView() { 
     mRecyclerView.setAdapter(adapter); 
     mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2)); 
     mRecyclerView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (DetailMainActivity.FAB_Status) { 
        DetailMainActivity.hideFAB(); 
        DetailMainActivity.FAB_Status = false; 
       } 
       return false; 
      } 
     }); 
    } 

    private void setupAdapter() { 

adapter = new DetailMainTaskAdapter(simpleTaskList, this); 
    } 

AddSimpleTask を持っており、これが私のDialogFragmentです。 DialogFragmentが早期に却下されるのを避けるためにsetOnShowListener()を設定しました。

@Override 
    public void onShow(DialogInterface dialogInterface) { 
     final AlertDialog dialog =(AlertDialog) getDialog(); 
     if (dialog != null){ 
      Button positiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE); 
      Button negativeButton = dialog.getButton(Dialog.BUTTON_NEGATIVE); 

      positiveButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if (mEditTextName.getText().toString().trim().isEmpty() || 
          mEditTextContent.getText().toString().trim().isEmpty()) { 
         if (mEditTextName.getText().toString().trim().isEmpty()) { 
          mEditTextName.setError("Can not be empty"); 
         } 

         if (mEditTextContent.getText().toString().trim().isEmpty()) { 
          mEditTextContent.setError("Can not be empty"); 
         } 
        }else { 
         presenter.beingInsertion(mEditTextName.getText().toString().trim(), mEditTextContent.getText().toString().trim() 
           , foreignId); 
        } 
       } 
      }); 

      negativeButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        dismiss(); 
       } 
      }); 
     } 
    } 

挿入がonInsertSuccess方法は、(私はMVPを使用しています)と呼ばれ、正常に達成された場合

@Override 
    public void onInsertSuccess() { 
     Snackbar.make(getActivity().findViewById(R.id.containerMainDetail), "Actividad agregada", Snackbar.LENGTH_SHORT).show(); 
     dismiss(); 
    } 

私は多くの場所でadapter.notifyDataSetChanged()と呼ばれている、と私はまた、カスタムで試してみましたインターフェイスが、私はこの仕事をすることはできません。

ご迷惑をおかけして申し訳ありませんが、ご協力いただきありがとうございます。

答えて

0

お客様の明細書にはいくつかの誤りがありますが、後でその点につきます。 notifyDataSetChanged()は、基になるリスト(または配列)が変更されたことをアダプターに通知するだけです。最初にデータベースを再クエリし、新しいリストを取得する必要があるということです。notifyDataSetChanged()をアダプタで呼び出す前に、元のリストはそのままでアダプタを更新しないため、何のポイントもありません。

これを呼び出す正しい方法は、ユーザーが値を入力しないために不必要にデータベースにクエリする可能性があるため、カスタムリスナーインターフェイスを経由し、onPause()/onResume()コールバックにはありません。カスタム・リスナー・インターフェースのインプリメンテーションでは、まずリストをDBからの新しいデータで更新し、アダプターに通知します。

アクティビティがDialogFragmentで覆われていると、onPause()/onResume()コールバックが発生しないという前提でエラーが発生します。これは間違っています。アクティビティビューが部分的に覆われた瞬間に、onPause()コールバックがトリガされます。

関連する問題