android - fragment 在第二次点击时无法正确显示?

标签 android android-fragments android-viewpager

我知道我的标题不好,但我真的不知道怎么说这是一句话。当我第一次打开我的应用程序时,一切都正确加载。我单击其中一个卡片 View 打开一个新 fragment ,它正确显示。当我按回它回到主要 Activity ,一切都是正确的。但是,如果我再次单击 cardview 以打开一个新 fragment ,它就不起作用。它加载新 fragment ,因为选项卡显示但 viewpager 不加载任何内容。我提供的图片对此有更好的解释。

第一次加载: pic 1

从卡片 View 输入 fragment : pic 2

压回: pic 3

再次从卡片 View 中输入 fragment : pic 4

主要 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));

    }

新闻 fragment :

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);
    }

新闻适配器:

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();
    }
}

最佳答案

我需要改变

public class MyPageAdapter extends FragmentPagerAdapter {

public class MyPageAdapter extends FragmentStatePagerAdapter {

关于android - fragment 在第二次点击时无法正确显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900259/

相关文章:

android - 如何使用安卓ViewPager?

android ndk-gdb 无法加载符号

android - 使用 houdini(Android 模拟器)在基于 x86 的 AVD 上运行 ARM 库

android - Kotlin 中的 Nothing 子类是其他类的吗?

android - fragment 中 ListView 上的按钮单击监听器

android - YouTubePlayerSupportFragment-initialize() 方法中的空指针异常

android - 查看寻呼机 Android - 更改项目

java - 如何在 Android 应用程序的外部类中使用 Java 加载此文本文件?

java - 带有 viewpager 的 TabLayout 不能平滑滚动

Android:ViewPager - PagerSlidingTabStrip,state_selected 上的自定义选项卡背景