简体   繁体   English

Android片段更新问题

[英]Android fragment update issue

I have three fragments using tablayout. 我有三个使用tablayout的片段。 Problem is that i save data in fragment one and wants to show data in second fragment but second fragment not update when click or swipe to second fragment because fragment not create again due to default offsetlimit 1. When i restart app again the data is showed. 问题是我将数据保存在第一个片段中,并想在第二个片段中显示数据,但是单击或滑动到第二个片段时第二个片段不会更新,因为默认的offsetlimit 1导致片段不再创建。当我再次重新启动应用程序时,将显示数据。 Any solution highly appreciated. 任何解决方案高度赞赏。

//My MainActivity code here //我的MainActivity代码在这里

public class MainActivity extends AppCompatActivity
{
    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private int[] tabIcons = {
            R.drawable.calender,
            R.drawable.favourite,
            R.drawable.setting_icon
    };

    PagerAdapter pagerAdapter;

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

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayShowTitleEnabled(false);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        pagerAdapter =  new PagerAdapter(getSupportFragmentManager(), MainActivity.this);
        viewPager.setAdapter(pagerAdapter);
       // viewPager.setOffscreenPageLimit(0);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.getTabAt(0).setIcon(R.drawable.calender_hover);


        for (int i = 0; i < tabLayout.getTabCount(); i++)
        {
            TabLayout.Tab tab = tabLayout.getTabAt(i);
            tab.setCustomView(pagerAdapter.getTabView(i));
        }

    }

    class PagerAdapter extends FragmentStatePagerAdapter
    {

        String tabTitles[] = new String[] { "Tab One", "Tab Two", "Tab Three", };

        private int[] tabIcons = { R.drawable.tab_selector_calendar, R.drawable.tab_selector_favorite, R.drawable.tab_selector_settings
        };

        Context context;

        public PagerAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
        }

        @Override
        public int getCount() {
            return tabTitles.length;
        }

        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    return new FragmentAyah();
                case 1:
                    return new FragmentFavorite();
                case 2:
                    return new FragmentSettings();
            }

            return null;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
           // return tabTitles[position];
            return null;
        }

        public View getTabView(int position) {
            View tab = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_tab, null);
            ImageView imgView = (ImageView) tab.findViewById(R.id.imgView);

            imgView.setBackgroundResource(tabIcons[position]);


            //  TextView tv = (TextView) tab.findViewById(R.id.custom_text);
            // tv.setText(tabTitles[position]);
            return tab;
        }

    }

}
 and Fragment code

//Tab 1 FragmentAyah code here //在这里标签1 FragmentAyah代码

public class FragmentAyah extends Fragment
{
    private RecyclerView recyclerView;
    private List<Ayat> ayatList = new ArrayList<>();
    private AyatAdapter ayatAdapter;
    DBHelper dbHelperA;
    List<AyatVariables> datalist = new ArrayList<AyatVariables>();
    String formattedDate = "";
    SimpleDateFormat df;
    private Calendar c;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_ayah, null);

        recyclerView = (RecyclerView) root.findViewById(R.id.recycler_view);
        ayatAdapter = new AyatAdapter(ayatList,getActivity());

        dbHelperA = new DBHelper(getActivity());

        c = Calendar.getInstance();
        df = new SimpleDateFormat("yyyy-MM-dd");
        formattedDate = df.format(c.getTime());

        getAllValuesFromDB();

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getActivity()));
        recyclerView.setAdapter(ayatAdapter);
        ayatAdapter.notifyDataSetChanged();

        return root;
    }

    private void prepareMovieData() {
        // AyatVariables ayat = new AyatVariables("Surah Al-Fatiha","Ayat","1",":11","Translation11");
for (int i = 0; i < datalist.size(); i++) {
                    Ayat ayat = new Ayat(datalist.get(i).getID(), datalist.get(i).getSURAH_NAME(),
                            datalist.get(i).getTEXTS(), datalist.get(i).getSURAH(),
                            datalist.get(i).getAYA(), datalist.get(i).getEN_TRANSLATION(),
                            datalist.get(i).getDATES());

                    ayatList.add(ayat);

                ayatAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onDestroyView()
    {
        super.onDestroyView();
        Log.e("onDestroyView======>","onDestroyView");
        ayatAdapter.notifyDataSetChanged();
        ayatList.clear();
    }

    public void getAllValuesFromDB()
    {
        try {
            dbHelperA.createDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        datalist.clear();
        datalist = dbHelperA.getDataWithAllTranslation(formattedDate);
       // Log.e("datasize=========>",""+datalist.size());
        dbHelperA.close();

        prepareMovieData();
    }

}

//Tab 2 FragmentFavorite code here //标签2片段收藏代码在这里

public class FragmentFavorite extends Fragment {

    private RecyclerView recyclerView;
    private List<FAyat> ayatList = new ArrayList<>();
    private AyatFAdapter ayatAdapter;
    DBHelper dbHelperA;
    DBHelper2 dbHelperF;
    List<AyatVariables> datalist = new ArrayList<AyatVariables>();
    List<FavVariables> fVar = new ArrayList<FavVariables>();
    String formattedDate = "";
    SimpleDateFormat df;
    private Calendar c;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_favorits, null);
        recyclerView = (RecyclerView) root.findViewById(R.id.frecycler_view);
        ayatAdapter = new AyatFAdapter(ayatList, getActivity());

        dbHelperA = new DBHelper(getActivity());
        dbHelperF = new DBHelper2(getActivity());

        c = Calendar.getInstance();
        df = new SimpleDateFormat("yyyy-MM-dd");
        formattedDate = df.format(c.getTime());

        getAllValuesFromDB();

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(ayatAdapter);
        ayatAdapter.notifyDataSetChanged();

        return root;
    }

    private void prepareMovieData() {
        // AyatVariables ayat = new AyatVariables("Surah Al-Fatiha","Ayat","1",":11","Translation11");

       for (int i = 0; i < datalist.size(); i++) {
                    FAyat ayat = new FAyat(datalist.get(i).getID(), datalist.get(i).getSURAH_NAME(),
                            datalist.get(i).getTEXTS(), datalist.get(i).getSURAH(),
                            datalist.get(i).getAYA(), datalist.get(i).getEN_TRANSLATION(),
                            datalist.get(i).getDATES());

                    ayatList.add(ayat);

                            ayatAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ayatList.clear();
    }

    public void getAllValuesFromDB()
    {
        getIDfromFav();

        try {
            dbHelperA.createDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        for (int i = 0; i<fVar.size();i++) {
           // datalist = dbHelperA.getAllDataForFav(fVar.get(i).getFavID());
            datalist.add(dbHelperA.getAllDataForFav(fVar.get(i).getFavID()));

            Log.e("datasize=========>",""+datalist.size());
        }
        dbHelperA.close();

        prepareMovieData();
    }

    public void getIDfromFav()
    {
        fVar.clear();
        fVar = dbHelperF.getAllFav();
        Log.e("fVar--size",""+fVar.size());
        dbHelperF.close();
    }

}

You can like the non-coupled class with data changes using many ways. 您可以通过多种方式将非耦合类与数据更改一起使用。 Here is a sample code with Broadcast Receiver: 这是广播接收器的示例代码:

In your Fragment 1, when there is some data changed, do this, 在片段1中,当某些数据发生更改时,请执行此操作,

Intent intent = new Intent("my-event");
// add data
intent.putExtra("message", "data"); // This data can be anything which is changed. You can also use SharedPreference and can remove that after using it
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

Now, in the Fragment 2, First you have to register this fragment as a receiver, 现在,在片段2中,首先您必须将此片段注册为接收者,

@Override
public void onResume() {
super.onResume();

// Register mMessageReceiver to receive messages.
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("my-event"));
}

Now, after registering, you have to handle the receive intent 现在,注册后,您必须处理接收意图

// handler for received Intents for the "my-event" event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Extract data included in the Intent or from SharedPreference in that case
String message = intent.getStringExtra("message");
Log.d("receiver", "Got message: " + message);
// In your case, you have to update the views or values in this method
 }
};

And pause the listening onPause to avoid null context 并在onPause上暂停监听以避免空上下文

@Override
protected void onPause() {
// Unregister since the fragment is not visible
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onPause();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM