0

データが正常に送信されたときに、ローカルデータベースからRecyclerViewにデータをリフレッシュするにはどうすればよいですか?私はアプリケーションのタブを使います。 2nd-Tabはデータを送信する関数であり、成功した場合、データはlocalDBに格納されます。別のフラグメントでデータが変更されたときにRecyclerViewを1つのフラグメントでリフレッシュする方法

データlocalDB3rd-Tabでお届けします。 何が起こるのですか、1st-Tabをスワイプしてから2nd-Tabにスワイプして、新しい3rd-TabのデータにスクロールしてlocalDBと表示されました。が正常に表示されました。

2番目のタブでデータを送信する場合は、3rd-Tabにスワイプして、のデータにはのデータは表示されません。 最初に1st-Tabにスワイプしないで直接データを表示するには、2nd-Tab3rd-Tabにスクロールする必要がありますか? 2nd-Tab

MainActivity

import android.os.Bundle; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 

import com.bertho.gmyl.fragments.EngagedFragment; 
import com.bertho.gmyl.fragments.RequestFragment; 
import com.bertho.gmyl.fragments.SigninFragment; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    private static final String TAG = MainActivity.class.getSimpleName(); 

    private Toolbar toolbar; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.engine_main); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     //getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFrag(new SigninFragment(), "SIGN-IN"); 
     adapter.addFrag(new EngagedFragment(), "ENGAGED ID"); 
     adapter.addFrag(new RequestFragment(), "LOCATION"); 
     viewPager.setAdapter(adapter); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     public void addFrag(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
    } 

} 

EngagedFragment(第二-タブ)フォームデータに

を保存する
import android.os.Bundle; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

import com.bertho.gmyl.R; 
import com.bertho.gmyl.model.Engaged; 
import com.google.firebase.database.DataSnapshot; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.database.ValueEventListener; 
import com.bertho.gmyl.realm.RealmHelper; 

public class EngagedFragment extends Fragment implements View.OnClickListener { 

    private static final String TAG = EngagedFragment.class.getSimpleName(); 

    private EditText nama, email, nohp; 
    private Button btnSaveConnection; 
    private DatabaseReference mFirebaseDatabase; 
    private FirebaseDatabase mFirebaseInstance; 
    private RelativeLayout mRoot; 
    private View rootView; 
    private String userId; 
    private TextView lblNama, lblEmail, lblNohp; 
    private RelativeLayout relativeLayout; 

    private RealmHelper realmHelper; 


    public EngagedFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     rootView = inflater.inflate(R.layout.fragment_engaged, container, false); 

     realmHelper = new RealmHelper(getActivity()); 

     String appName = getResources().getString(R.string.app_name); 

     loadLocalDB(); 

     nama = (EditText) rootView.findViewById(R.id.txtName); 
     email = (EditText) rootView.findViewById(R.id.txtEmail); 
     nohp = (EditText) rootView.findViewById(R.id.txtNoHp); 

     lblNama = (TextView) rootView.findViewById(R.id.lblNameval); 
     lblEmail = (TextView) rootView.findViewById(R.id.lblEmailval); 
     lblNohp = (TextView) rootView.findViewById(R.id.lblNohpval); 
     relativeLayout = (RelativeLayout) rootView.findViewById(R.id.panelLabelDetail); 
     btnSaveConnection = (Button) rootView.findViewById(R.id.btnEngaged); 


     mFirebaseInstance = FirebaseDatabase.getInstance(); 

     mFirebaseDatabase = mFirebaseInstance.getReference("tbl_engaged"); 

     mFirebaseInstance.getReference("titleapp").setValue(appName); 

     mFirebaseInstance.getReference("titleapp").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.e(TAG, "TITLE UPDATED FROM FIREBASE"); 
       String appTitle = dataSnapshot.getValue(String.class); 
       ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(appTitle); 
      } 

      @Override 
      public void onCancelled(DatabaseError error) { 
       Log.e(TAG, "FAILED TO READ TITLE FROM FIREBASE.", error.toException()); 
      } 
     }); 

     btnSaveConnection.setOnClickListener(this); 

     return rootView; 
    } 

    private void showSnack(String notify) { 
     mRoot = (RelativeLayout) rootView.findViewById(R.id.frag_engaged); 
     Snackbar snackbar = Snackbar.make(mRoot, notify, Snackbar.LENGTH_LONG); 
     snackbar.show(); 
    } 

    public void onClick(View v) { 

     if(v.getId() == R.id.btnEngaged) { 

      String txtName = nama.getText().toString(); 
      String txtEmail = email.getText().toString(); 
      String txtNo = nohp.getText().toString(); 

      if(txtName.equals("") || txtName.isEmpty()) { 
       showSnack("Name must filled"); 
       nama.requestFocus(); 
      } else if (txtEmail.equals("") || txtEmail.isEmpty()) { 
       showSnack("Email must filled"); 
       email.requestFocus(); 
      } else if (txtNo.equals("") || txtNo.isEmpty()) { 
       showSnack("No.HP must filled"); 
       nohp.requestFocus(); 
      } else { 
       createUser(txtName, txtEmail, txtNo); 
       saveToLocalDB(txtName, txtEmail, txtNo); 
      } 
     } 
    } 

    private void saveToLocalDB(String txtName, String txtEmail, String txtNo) { 
     realmHelper.addEngaged(txtName, txtEmail, txtNo); 
    } 

    private void loadLocalDB() { 
     realmHelper.getAllData(); 
    } 

    private void createUser(String name, String email, String nohp) { 
     userId = mFirebaseDatabase.push().getKey(); 
     Engaged user = new Engaged(name, email, nohp); 
     mFirebaseDatabase.child(userId).setValue(user); 
     addUserChangeListener(); 
    } 

    private void addUserChangeListener() { 

     mFirebaseDatabase.child(userId).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Engaged user = dataSnapshot.getValue(Engaged.class); 

       if (user == null) { 
        Log.e(TAG, "ENGAGED DATA IS NULL"); 
        return; 
       } 

       Log.e(TAG, "ENGAGED DATA IS CHANGED!" + user.name + ", " + user.email); 

       lblNama.setText(user.name); 
       lblEmail.setText(user.email); 
       lblNohp.setText(user.nohp); 

       //relativeLayout.setVisibility(View.VISIBLE); 

       nama.setText(""); 
       email.setText(""); 
       nohp.setText(""); 
      } 

      @Override 
      public void onCancelled(DatabaseError error) { 
       // Failed to read value 
       Log.e(TAG, "FAILED TO READ USER", error.toException()); 
      } 
     }); 
    } 
} 

RequestFragment(サードタブ)localDB

を表示するには
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import com.bertho.gmyl.R; 
import com.bertho.gmyl.adapter.AdapterEngaged; 
import com.bertho.gmyl.model.ModelEngaged; 
import com.bertho.gmyl.realm.RealmHelper; 

import java.util.ArrayList; 

public class RequestFragment extends Fragment { 

    private static final String TAG = "RequestFragment"; 
    private RecyclerView recyclerView; 
    private View rootView; 
    private ArrayList<ModelEngaged> data; 
    private RealmHelper helper; 

    public RequestFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     rootView = inflater.inflate(R.layout.fragment_request, container, false); 

     data = new ArrayList<>(); 
     helper = new RealmHelper(getActivity()); 

     recyclerView = (RecyclerView) rootView.findViewById(R.id.rvArticle); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 

     setRecyclerView(); 

     return rootView; 
    } 

    public void setRecyclerView() { 
     try { 
      data = helper.findAllArticle(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     AdapterEngaged adapter = new AdapterEngaged(data, new AdapterEngaged.OnItemClickListener() { 
      @Override 
      public void onClick(ModelEngaged item) { 
       Toast.makeText(getContext(), "LIST CLICKED", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     recyclerView.setAdapter(adapter); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     try { 
      data = helper.findAllArticle(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     setRecyclerView(); 
    } 


} 

すべてがスムーズに行ってきました、それだけで私はフォームが送信されたときにデータが表示されることを願って直接サードタブで見ることができることを

+0

これを試して、アクティビティのインタフェースを使用し、2番目のタブでコールバックを設定し、アクティビティreloaのコールバックメソッドで送信するときはいつでもd 3番目のフラグメントのリスト – Raghavendra

+0

ViewPagerの初期化後に、mainactivity oncreateメソッドでこの行を追加してみます:ViewPager.setOffscreenPageLimit(3); –

+0

'viewPager.setOffscreenPageLimit();でその効果がありません –

答えて

2

は、

public interface SubmitListener { 

    void onSubmit(); 
} 

private SubmitListener onSubmitListener; 

public void setSubmitListener(SubmitListener onSubmitListener){ 
     this.onSubmitListener = onSubmitListener; 
} 

public SubmitListener getOnSubmitListener(){ 
     return onSubmitListener; 
} 
を言うEngagedFragment のインタフェースを作成し、これを試してみてください

saveToLocalDB(...)メソッド

コールMainActivityで

onSubmitListener.onSubmit(); 

1)以下のステートメントを更新します

public class MainActivity extends AppCompatActivity implements EngagedFragment.SubmitListener 

2)あなたのViewPagerAdapterアダプタを作成します。グローバル変数としての変数。

断片添加しながら:

EngagedFragment engagedFrag = new EngagedFragment(); 
adapter.addFrag(engagedFrag, "ENGAGED ID"); 

... 
viewPager.setAdapter(adapter); 

3)アダプタ

engagedFrag.setSubmitListener(this); 

4)をonSubmit()メソッドをオーバーライドを設定した後にこれを追加し、その方法では以下のコードを試みる

if(viewPager != null){ 

    if(adapter != null){ 
     Fragment fragment = adapter.getItem(2); 
     if(fragment != null){ 
      RequestFragment requestFragment = (RequestFragment) fragment; 
      requestFragment.setRecyclerView(); 
     } 
    } 
} 
+0

ハイ@Raghavendra、私はあなたのコードを試して、私はボタンをクリックしたときに強制的にクローズクローズを発見した。エラー 'java.lang.NullPointerException:インタフェースメソッドを呼び出そうとしています 'void com.bertho.gmyl.fragments.EngagedFragment $ SubmitListener.onSubmit()'ヌルオブジェクトリファレンスで' 多分私は何かが欠けています。しかし、私がチェックすると、データが保存されます。強制的に私のアプリを閉じる。これはEngagedFragmentあるhttp://pastebin.com/mnMVzkjr : これはMainActivityあるhttp://pastebin.com/bWgSGmuk –

+0

@BerthoJoris 2番目と3番目のポイント – Raghavendra

+1

Yeaahh .....完璧な作品をご確認ください.. ... :) ありがとう@Raghavendra ...私は別のタブを持っている場合は、5番目のタブを言うと、私は再度onSubmitメソッド内のコードを上書きする必要がありますか? –

1

この

mViewPager.setOffscreenPageLimit(0); 

を試してみてくださいだとdoesntのヘルプ場合私はの1に見られるように、これは動作しない場合がありますmViewPager.setOffscreenPageLimit(0); @:

fragment refresh On Swip

約:、SOの質問の下に確認してください -

"ViewPagerには、少なくとも1つのオフスクリーンページが必要です。 Yesです。私が正しく、ソースコードを読んでいた場合は、LogCatでこれに関する警告を取得しなければならない、のようなもの:

Requested offscreen page limit 0 too small; defaulting to 1" 
+0

はい.. 'viewPager.setOffscreenPageLimit(0);で動作しません –

+0

あなたはリンクされた答えを試しましたか? – Bawa

+0

まだありません...しかし、私はこの後にしようとします –

関連する問題