最近改变,需要自定义频道,涉及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方法:
/**
* @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页面顺序的方式? 总之可能后续需要你做更多的优化处理。。。哪怕你要去看哈源码。。。这或许是我们应该往深的方向和进阶的道路指引吧。。。。
其他的想法:可以参考。。。
网友评论