ViewPager+FragmentPagerAdapter强制

作者: MonkeyLei | 来源:发表于2019-10-15 08:09 被阅读0次

最近改变,需要自定义频道,涉及ViewPaper的Fragment的添加和删除,如下:

我需要删除其中某个频道,同时页面需要剔除,同时Tablayout也需要更新。我采用的是SlidingTabLayout + ViewPager + FragmentPagerAdapter + Fragment的方式。SlidingTabLayout 是三方的。 我需要解决:

1. 更新Tableyout标题

2. 更新Viewpaper(我图简单就直接销毁重建了,我想其他方式应该还需要深入Fragment的管理才行)

3. 至于其他的组合方式,看情况刷新就好

问题1:采用如下方式进行刷新,根本没什么用。

问题2:FragmentPagerAdapter增加网友说的方式,来。。。嚯哈哈。其实也不行。。。

@Override

public int getItemPosition(Object object) {

    // 最简单解决 notifyDataSetChanged() 页面不刷新问题的方法

    return POSITION_NONE;

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

    // 把 Object 强转为 View,然后将 view 从 ViewGroup 中清除

    container.removeView((View) object);

}

解决:

A. ViewPager的FragmentPagerAdapter的刷新

OtherFragmentAdapter.java - 重点就是提供setFragments方法,同时getItemPosition需要返回POSITION_NONE.

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentPagerAdapter;

import android.support.v4.app.FragmentTransaction;

import android.view.View;

import android.view.ViewGroup;

import java.util.ArrayList;

import java.util.List;

/**

* Created by hl on 2018/3/12.

*/

/**

* 资讯碎片适配器

*/

public class OtherFragmentAdapter extends FragmentPagerAdapter{

    private List<String> mTitleList;

    private List<Fragment> mFragmentList;

    private FragmentManager fm;

    public OtherFragmentAdapter(FragmentManager fm, List<String> titleList, List<Fragment> fragmentList){

        super(fm);

        this.fm = fm;

        this.mTitleList = titleList;

        this.mFragmentList = fragmentList;

    }

    @Override

    public Fragment getItem(int position) {

        return mFragmentList.get(position);

    }

    @Override

    public int getCount() {

        return mFragmentList.size();

    }

    public void setFragments(List<Fragment> fragments) {

        if(this.mFragmentList != null){

            FragmentTransaction ft = fm.beginTransaction();

            for(Fragment f:this.mFragmentList){

                ft.remove(f);

            }

            ft.commit();

            ft = null;

            fm.executePendingTransactions();

        }

        this.mFragmentList = fragments;

        notifyDataSetChanged();

    }

    @Override

    public int getItemPosition(Object object) {

        return POSITION_NONE;

    }

}

然后刷新 - 注意:fragmentList需要重新New一个,否则如果还是之前的列表对象,那么你会发现,还是没有能销毁重建!!!

            fragmentList = new ArrayList<>();

            fragmentList.add(InfoFragmentNews.newInstance("news", mParam2/*资讯*/));

            for (int i = 0; i < tagTypeList.size(); ++i) {

                fragmentList.add(OtherProjectFragment.newInstance(tagTypeList.get(i), tags.get(i)));

            }

            mInfoFragmentAdapter.setFragments(fragmentList);

B. SlidingTabLayout的刷新,由于没有对应的方法来刷新,所以我自己修改源码添加的对应的updateTitle方法:

SlidingTabLayout.java

  /**

    * @hl 更新标题

    * @param titles

    */

    public void updateTitle(String[] titles){

        mTitles.clear();

        Collections.addAll(mTitles, titles);

        notifyDataSetChanged();

    }

然后更新数据即可 - 都处理完以后,记得重新设置tab选中页为第一页。

  String[] strings = new String[titleList.size()];

            titleList.toArray(strings);

            infosSlideTabLayout.updateTitle(strings);

            ///< 设置默认选中页(viewpaper也可以设置)

            infosSlideTabLayout.setCurrentTab(1);

            ///< 设置选中页状态(字体大小,颜色等)

            infosSlideTabLayout.onPageSelected(1);

以上就是我自定义频道后的导航的相关处理。目前来看没啥大问题 。。。感觉还是麻烦。 另外可以做优化,比如如果频道只是新增了,是不是没有必要这样做,只需要添加。如果换位置了,是否要销毁重建? 能不能有更换Viewpaper页面顺序的方式? 总之可能后续需要你做更多的优化处理。。。哪怕你要去看哈源码。。。这或许是我们应该往深的方向和进阶的道路指引吧。。。。

其他的想法:可以参考。。。

https://blog.csdn.net/axi295309066/article/details/53574976

相关文章

  • ViewPager+FragmentPagerAdapter强制

    最近改变,需要自定义频道,涉及ViewPaper的Fragment的添加和删除,如下: 我需要删除其中某个频道,同...

  • Android填坑之路——FragmentPagerAdapte

    原因分析 在使用ViewPager+FragmentPagerAdapter时候,更新Fragment里数据是不起...

  • 带你走过ViewPager不刷新界面的坑

    最近在项目中用到ViewPager+FragmentPagerAdapter的方式来做界面,其中当adapter的...

  • 记录ViewPager+FragmentPagerAdapter

    尝试使用leakcanary 查看内存泄漏问题,不看不知道,一看吓一跳,在FragmentPagerAdapter...

  • js 实用小套路,你需要的开发小技巧

    强制类型转换 强制转换为Boolean 用 !! 强制转换为Number 用 + 强制转换为String 用 ""...

  • app升级测试点

    作者:Gakki app升级测试点 主要分为强制强制更新与非强制更新 强制更新测试点:强制升级是否可以升级成功:从...

  • 强制

    什么是强制学习,什么是非强制学习? 非强制学习在某种意义上就是主动学习,强制学习也就是被动学习,那么他们之间...

  • 强制

    强制别人行为将是一件坏事情,即使在公理看起来是对的,因为人都有暂时凝固的价值观在指挥着他的直觉与行动!违背直觉一定...

  • 强制

    总是有办法强制性融合,但是自圆其说就有些难了。 明日需要将所有的事件都看一遍才好。 这就是强制事件。 无法简约和跳...

  • 强制

    版本【2.0】版本 公告【软件已更新】公告

网友评论

    本文标题:ViewPager+FragmentPagerAdapter强制

    本文链接:https://www.haomeiwen.com/subject/gkdjmctx.html