Dreamers Org
Dreamers Org

Reputation: 1229

Fragment not displaying correctly on second click?

I know my title is not good but i dont really know how to put this is one sentence. When i open my app for the first time, everything load correctly. I click on one of the cardviews to open a new fragment and it displays correctly. When i press back it goes back to the mainactivity and everythings is correct. However if i then click on cardview again to open a new fragment it does not work. It loads the new fragment because the tabs display but the viewpager does not load anything. It is better explained in the pictures i have provided.

First Load: pic 1

Entered Fragment from cardview: pic 2

Pressed Back: pic 3

Entered Fragment from cardview again: pic 4

Main Activity:

    public class MainActivity extends AppCompatActivity {
private ArrayList<NewsItem> items;
    private RecyclerView r;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        r = (RecyclerView) findViewById(R.id.newsRecyclerView);
        if (getSupportActionBar()!=null) getSupportActionBar().setElevation(0);
        r.setHasFixedSize(true);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(),3);
        r.setLayoutManager(gridLayoutManager);
        initializeItems();
        NewsAdapter newsAdapter = new NewsAdapter(this,items);
        r.setAdapter(newsAdapter);
        OverScrollDecoratorHelper.setUpOverScroll(r, OverScrollDecoratorHelper.ORIENTATION_VERTICAL);

    }

    private void initializeItems(){
items = new ArrayList<NewsItem>();
        ArrayList<NewsCat> vp = new ArrayList<NewsCat>();
        vp.add(new NewsCat("News","http://vapepolitics.com/feed/"));
        vp.add(new NewsCat("Products","https://bitcoinmagazine.com/feed/"));
        items.add(new NewsItem(R.mipmap.ic_launcher,"Vape Politics",vp,1));
        ArrayList<NewsCat> vm = new ArrayList<>();
        vm.add(new NewsCat("News","https://vapemagazine.com/feed/"));
        items.add(new NewsItem(R.mipmap.ic_launcher,"Vape Magazine",vm,1));
        ArrayList<NewsCat> vv = new ArrayList<>();
        vv.add(new NewsCat("News","http://www.vaporvanity.com/feed/"));
        items.add(new NewsItem(R.mipmap.ic_launcher,"Vapor Vanity",vv,1));

    }

NewsFragment:

public class NewsFragment extends Fragment {
private View v;
    private ViewPager mViewPager;
private List<NewsCat> links;
    private NavigationTabStrip mCenterNavigationTabStrip;
    private String[] titles;
    private String[] linkes;
    private Context context;
MyPageAdapter pageAdapter;
    public NewsFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        v = inflater.inflate(R.layout.fragment_news, container, false);
        Bundle bundle = getArguments();

        Type type = new TypeToken<List<NewsCat>>() {}.getType();
        Gson gson = new Gson();
        String json = bundle.getString("links");
        List<NewsCat> linkers = gson.fromJson(json,type);
        links = linkers;
        mViewPager = (ViewPager) v.findViewById(R.id.vp);
        getFragments();
        initUI(v);
setUI();

        return v;
    }

    private void initUI(View v) {
        mViewPager = (ViewPager) v.findViewById(R.id.vp);
        mCenterNavigationTabStrip = (NavigationTabStrip) v.findViewById(R.id.nts_center);

    }
    private List<Fragment> getFragments() {
        List<Fragment> fList = new ArrayList<Fragment>();
        for (int i=0;i <links.size();i++) {
            fList.add(HalfFragment.newInstance(links.get(i).getLink()));
        }

        return fList;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    private void setUI() {
        List<Fragment> fragments = getFragments();
        titles = new String[links.size()];
        linkes = new String[links.size()];
        for (int i = 0;i<links.size();i++) {
            NewsCat newsCat = links.get(i);
            titles[i] = newsCat.getTitle();
            linkes[i] = newsCat.getLink();
        }
        pageAdapter = new MyPageAdapter(getActivity().getSupportFragmentManager(), linkes);
        mViewPager.setAdapter(pageAdapter);
        mCenterNavigationTabStrip.setTitles(titles);
        mCenterNavigationTabStrip.setTabIndex(0,true);
        mCenterNavigationTabStrip.setViewPager(mViewPager);
    }

NewsAdapter:

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.PersonViewHolder> {
    private Context context;
    private ArrayList<NewsItem> items;

    public NewsAdapter(Context context, ArrayList<NewsItem> newsItems) {
        this.context = context;
        this.items = newsItems;
    }

    public class PersonViewHolder extends RecyclerView.ViewHolder {
        CardView cv;
        TextView personName;
        TextView personAge;
        ImageView personPhoto;

        PersonViewHolder(View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.newsItemCard);
            personName = (TextView) itemView.findViewById(R.id.newsItemTitle);
            personPhoto = (ImageView) itemView.findViewById(R.id.newsItemImage);
        }
    }

    @Override
    public NewsAdapter.PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item, parent, false);
        PersonViewHolder pvh = new PersonViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(PersonViewHolder holder, int position) {
        final NewsItem newsItem = items.get(position);
        holder.personName.setText(items.get(position).getTitle());
        //holder.personPhoto.setImageResource(items.get(position).getImage());
        Picasso.with(context).load(items.get(position).getImage()).resize(400,400).into(holder.personPhoto);
        holder.cv.setCardElevation(10);
        holder.cv.setClipToPadding(false);
        holder.cv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bundle args = new Bundle();
                //args.putParcelableArray("links",newsItem.getLink());
                Gson gson = new Gson();
                Type type = new TypeToken<List<NewsCat>>() {}.getType();
                String json = gson.toJson(newsItem.getLink(),type);
                args.putString("links",json);
                NewsFragment rssFragment = new NewsFragment();
                rssFragment.setArguments(args);
                FragmentManager fragmentManager = ((FragmentActivity)context).getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.content_main,rssFragment).addToBackStack(null).commit();
            }
        });
    }



    @Override
    public int getItemCount() {
        return items.size();
    }
}

Upvotes: 1

Views: 451

Answers (2)

Zon
Zon

Reputation: 19880

Although example code is not the case, I had this problem when Fragment instance was stored in second activity. So when it was finished and restarted, the FragmentManager reused this old Fragment instance first, and created a new one only on second click:

public class SecondActivity {

private static Fragment fragment;

  @Override
  public void onBackPressed() {
    ...  
    SecondActivity.setFragment(null);
    ...
  }
}

Upvotes: 0

Dreamers Org
Dreamers Org

Reputation: 1229

I needed to change

public class MyPageAdapter extends FragmentPagerAdapter {

to

public class MyPageAdapter extends FragmentStatePagerAdapter {

Upvotes: 1

Related Questions