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

尚未...但我会尝试此 –

相关问题