0

如何在成功提交數據時將數據從本地數據庫刷新到RecyclerView?我使用應用程序中的選項卡。 2nd-Tab函數提交數據,如果成功,數據將被存儲在localDB中。如何在另一個片段中的數據更改時在一個片段中刷新RecyclerView

關於localDB的數據我將出示3rd-Tab。 但是會發生什麼,我必須滑動1st-Tab,然後滑動到2nd-Tab,然後滑動到我的localDB上的新數據3rd-Tab已成功顯示

如果2nd-Tab我提交數據,那麼我刷卡到3rd-Tab,數據將不會出現在數據列表的數據列表。 如何直接顯示數據而不需要刷卡到第一個1st-Tab,然後到2nd-Tab3rd-Tab2nd-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(第二-Tab鍵)形式保存數據

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


} 

一切順利,這只是我希望,當提交表單時,可以直接看到3號,標籤

+0

嘗試這一點,在活動中使用接口,並且每當您在第二個選項卡中提交時設置回調,並在活動回溯中設置回調方法d第3個片段的列表 – Raghavendra

+0

嘗試在Viewpager初始化之後在mainactivity oncreate方法中添加此行:ViewPager.setOffscreenPageLimit(3); –

+0

它對viewPager.setOffscreenPageLimit()沒有影響;' –

回答

2

試試這個,

創建EngagedFragment接口 說,

public interface SubmitListener { 

    void onSubmit(); 
} 

private SubmitListener onSubmitListener; 

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

public SubmitListener getOnSubmitListener(){ 
     return onSubmitListener; 
} 

在saveToLocalDB(...)方法

呼叫

onSubmitListener.onSubmit(); 

在MainActivity:

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:試圖調用接口方法'null com.bertho.gmyl.fragments.EngagedFragment $ SubmitListener.onSubmit()'在一個空對象引用上' 也許我想念一些東西。但是,當我檢查時,數據被保存。只強制關閉我的應用程序。 這是MainActivity:http://pastebin.com/mnMVzkjr 這是EngagedFragment:http://pastebin.com/bWgSGmuk –

+0

@BerthoJoris請第二和第三點 – Raghavendra

+1

Yeaahh .....完美的作品.. ... :) Thanks @Raghavendra ...順便說一句,如果我有另一個選項卡,讓我們說第5個選項卡,我必須再次代碼裏面onSubmit方法? –

1

試試這個

mViewPager.setOffscreenPageLimit(0); 

如果那不幫助,可顯示的數據請檢查下面SO問題:

fragment refresh On Swip

約:mViewPager.setOffscreenPageLimit(0);這可能無法正常工作,我的一個發現@普通軟件的答案如下: -

「ViewPager是否需要至少1個屏外頁面 Yes。如果我正確地閱讀源代碼,你應該得到一個關於此警告在logcat中,是這樣的:

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

是的..不適用'viewPager.setOffscreenPageLimit(0);' –

+0

你嘗試鏈接的答案? – Bawa

+0

尚未...但我會嘗試此 –

相關問題