Search code examples
androidandroid-recyclerviewfragmentlandscape

turning from portrait to landscape doupled data


I have an activity that contains a fragment that contains a recyclerview when I view the app in portrait it work fine but when I turn to landscape the data is doupled meaning I have a recyclerview when swipe it i see another under it.

the code of activity

public class DailyAzkaar extends AppCompatActivity {
    Toolbar toolbar;
    SharedPreferences settings;
    String locale;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_azkaar);
        settings = getSharedPreferences("MyPrefs", 0);
        locale = settings.getString("locale", "en-US");
        Locale.setDefault(Locale.forLanguageTag(locale));
        Configuration config = new Configuration();
        config.setLocale(Locale.forLanguageTag(locale));
        //config.locale = locale;
        getResources().updateConfiguration(config,getResources().getDisplayMetrics());
        toolbar=(Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FragmentManager fragmentManager=getSupportFragmentManager();
        FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
        DailyAzkaarFragment dailyAzkaarFragment=new DailyAzkaarFragment();
        fragmentTransaction.add(R.id.fragment_container,dailyAzkaarFragment);
        fragmentTransaction.commit();
    }
    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this,"onResume",Toast.LENGTH_SHORT).show();
    }
}

this is the code of fragment

public class DailyAzkaarFragment extends Fragment implements ItemClickListener {
    ArrayList<AzkarForm> list;
    RecyclerView rv;
    int activity;
    SharedPreferences settings;
    Boolean[] favourite=new Boolean[28];
    Boolean[] favourite_evening=new Boolean[27];
    RecyclerView.LayoutManager layoutManager;
    RecyclerFavouriteAdapter adapter;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.daily_azkaar_fragment,container, false);
        rv = (RecyclerView) view.findViewById(R.id.recyclerviewcard);
        activity = getActivity().getIntent().getIntExtra("activity", 3);
        AzkaarData azkaarData=new AzkaarData(getActivity());
        settings = getActivity().getSharedPreferences("MyPrefs", 0);
        if (settings.getBoolean("is_first_time", true)) {
            //the app is being launched for first time, do something
            Log.d("TAG", "First time");
            settings.edit().putBoolean("is_first_time", false).commit();
            storeArray(favourite,"fav",false,getActivity());
            storeArray(favourite_evening,"fav_evening",false,getActivity());
        } else {
            //second time launch..
            favourite=loadArray("fav",getActivity());
            favourite_evening=loadArray("fav_evening",getActivity());
            for(int i=0;i<favourite.length;i++)
                Log.d("msg ",String.valueOf(favourite[i]));
        }
        if(activity == 1)
            list=azkaarData.getArrayListData(favourite,activity);
        else
            list=azkaarData.getArrayListData(favourite_evening,activity);
        layoutManager=new LinearLayoutManager(getActivity());
        rv.setLayoutManager(layoutManager);
        rv.setHasFixedSize(true);
        adapter=new RecyclerFavouriteAdapter(list,activity,getActivity());
        rv.setAdapter(adapter);
        adapter.setClickListener(this);
        return view;
    }
    public boolean storeArray(Boolean[] array, String arrayName,boolean b, Context mContext) {
        settings = mContext.getSharedPreferences("MyPrefs", 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt(arrayName +"_size", array.length);
        for(int i=0;i<array.length;i++) {
            editor.putBoolean(arrayName + "_" + i, b);
            array[i]=b;
        }
        return editor.commit();
    }
    public Boolean[] loadArray(String arrayName, Context mContext) {
        settings = mContext.getSharedPreferences("MyPrefs", 0);
        int size = settings.getInt(arrayName + "_size", 0);
        Boolean array[] = new Boolean[size];
        for(int i=0;i<size;i++)
            array[i] = settings.getBoolean(arrayName + "_" + i, true);
        return array;
    }
    @Override
    public void onClick(View view, int position) {
        if(view.getId()==R.id.cardview) {
            //AzkarForm azkarForm = list.get(p);
            Intent intent = new Intent(getActivity(), DetailsActivity.class);
            intent.putExtra("position", position);
            if(activity == 1) intent.putExtra("activity", 3);
            else intent.putExtra("activity", 4);
            this.startActivity(intent);
        }
    }
}

Solution

  • When the orientation of the screen changes in Android, the activity is usually destroyed and recreated. The recreation may cause some anomalies. To solve this, you will need to save the state of the activity (or fragment or anything) and restore it when the activity is recreated. You should do the following

    public void onCreate(Bundle savedInstanceState) {
        ...
        if (savedInstanceState != null) {
            //Restore the fragment's instance
            mContent = getSupportFragmentManager().getFragment(savedInstanceState, "myFragmentName");
            ...
        }
        ...
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    
        //Save the fragment's instance
        getSupportFragmentManager().putFragment(outState, "myFragmentName", mContent);
    }
    

    mContent is a Fragment, the reference to the instance of the current fragment in the activity. I hope this helps.