当另一个片段中的数据更改时,如何刷新一个片段中的RecyclerView [英] How to refresh RecyclerView in one fragment when data changed in another fragment

查看:57
本文介绍了当另一个片段中的数据更改时,如何刷新一个片段中的RecyclerView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

成功提交数据后,如何将数据从本地数据库刷新到RecyclerView?我使用应用程序上的选项卡. 2nd-Tab用于提交数据,如果成功,则数据将存储在localDB中.

How do I refresh the data from a local database to RecyclerView when data was successfully submitted? I use the tabs on the application. 2nd-Tab functions to submit the data, and if successful, the data will be stored in localDB.

关于localDB的数据我将在3rd-Tab上提出. 但是发生了什么,我必须先滑动1st-Tab,然后滑动至2nd-Tab,然后滑动至我的localDB 成功显示的上的新3rd-Tab数据.

Data on localDB I will present at the 3rd-Tab. But what happens, I have to swipe 1st-Tab, then swipe to the 2nd-Tab and then swipe to the new 3rd-Tab data on my localDB successfully displayed.

如果第二个选项卡我要提交数据,则我滑动到3rd-Tab,数据将不出现在数据列表中. 我如何直接将数据显示出来而无需先滑至第一个1st-Tab,然后再滑至2nd-Tab3rd-Tab?

If the 2nd-Tab me to submit the data, then I swipe to 3rd-Tab, the data will not appear on the list of data. How do I get the data directly displayed without the need to swipe to the first 1st-Tab and then to the 2nd-Tab and 3rd-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 (第二标签)表单以保存数据

EngagedFragment (2nd-Tab) Form to save data

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 (第3个标签)以显示localDB

RequestFragment (3rd-Tab) To display 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个选项卡上直接查看

Everything went smoothly, it's just that I hope the data can be displayed when the form is submitted and can be directly viewed on the 3rd-Tab

推荐答案

尝试一下,

在EngagedFragment中创建接口 说

Create an Interface in EngagedFragment say,

public interface SubmitListener {

    void onSubmit();
}

private SubmitListener onSubmitListener;

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

public SubmitListener getOnSubmitListener(){
        return onSubmitListener;
}

在saveToLocalDB(...)方法中

In saveToLocalDB(...) method

致电

onSubmitListener.onSubmit();


在MainActivity中:

1)更新以下语句:


In MainActivity:

1) Update the below statement:

public class MainActivity extends AppCompatActivity implements EngagedFragment.SubmitListener

2)将您的 ViewPagerAdapter适配器; 变量设置为Global变量;

2) Make your ViewPagerAdapter adapter; variable as Global variable;

在添加片段时:

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

...
viewPager.setAdapter(adapter);

3)设置适配器后将其添加

3) add this after setting adapter

engagedFrag.setSubmitListener(this);

4)覆盖onSubmit()方法,然后在该方法中尝试下面的代码

4) Override onSubmit() method and try the below code in that method

if(viewPager != null){

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

这篇关于当另一个片段中的数据更改时,如何刷新一个片段中的RecyclerView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆