Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
来源:互联网 发布:广联达是什么软件 编辑:程序博客网 时间:2024/05/22 10:32
android3.0之后提出fragment概念正逐渐取代tabhost的地位,support-v4包也提供了很好使用的viewpager类。不多说。了解过fragment之后你会发现比tabhost好用许多,并且viewpager也支持fragment的嵌入,这使得项目的模块化耦合度大大降低,项目中使用ViewPager+Fragment实现tab分页+子tab页内容滑动效果
点击个个tab1更换pageadapter的值实现数据的更新。通过继承fragmentpageadpater你会发现使用起来很方便。具体fragmentpageradapter怎么用?网上很多看客可以去搜一下。 复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。 return POSITION_NONE; // Do we already have thisfragment? String name =makeFragmentName(container.getId(), position); Fragment fragment =mFragmentManager.findFragmentByTag(name); if (fragment != null) { if (DEBUG)Log.v(TAG, "Attaching item #" + position + ": f=" +fragment); mCurTransaction.attach(fragment); } else { fragment =getItem(position); if (DEBUG)Log.v(TAG, "Adding item #" + position + ": f=" +fragment); mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(),position)); }
if(this.fragments !=null){ FragmentTransaction ft = fm.beginTransaction(); for(Fragment f:this.fragments){ ft.remove(f); } ft.commit(); ft=null; fm.executePendingTransactions(); } this.fragments = fragments; notifyDataSetChanged();
效果图如下:
点击个个tab1更换pageadapter的值实现数据的更新。通过继承fragmentpageadpater你会发现使用起来很方便。具体fragmentpageradapter怎么用?网上很多看客可以去搜一下。
下面我就要说到本文的核心当你更新里fragmentList集合后调用fragmentpageadpater的notifyDataSetChanged方法时发现数据根本就没有刷新。网络上会提到pageadapter的刷新方案如下代码:
@Override
public int getItemPosition(Object object) {
}
结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。解决办法:在继承的fragmentpageadapter类里面添加这么一个方法
public voidsetFragments(ArrayList fragments) {
}
就能完美的解决fragmentpageadapter数据刷新。
代码:
/**
* Copyright @ jxl
*/
package com.hortor.officecloud.ui;
import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
/**
* @author kingjxl2006@126.com
* @since 2012-10-16 上午11:18:21
*/
public class FragmentVPAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
private FragmentManager fm;
public FragmentVPAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
super(fm);
this.fm = fm;
this.fragments = fragments;
}
public void setFragments(ArrayList<Fragment> fragments) {
if(this.fragments != null){
FragmentTransaction ft = fm.beginTransaction();
for(Fragment f:this.fragments){
ft.remove(f);
}
ft.commit();
ft=null;
fm.executePendingTransactions();
}
this.fragments = fragments;
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Fragment getItem(int arg0) {
return fragments.get(arg0);
}
@Override
public int getCount() {
return fragments.size();
}
}
另一篇文章:很多人在网上说ViewPager的PagerAdapter.notifyDataSetChanged()无效。刚开始我也这样认为,甚至被误导以为是真理。 后来,找了一下,在PagerAdatpar重写getItemPosition(),return POSITION_NONE即可每次刷新加载图面。这是关键点。 这时,如果只是修改"DataSet",如List等这类的,然后再notifyDataSetChanged(),会发现出现界面重叠。解决办法是重写destroyItem(),把ViewGroup强转为ViewPager,Object强转为View。最后ViewGroup.removeView()即可。
代码:
/**
* Copyright @ jxl
*/
package com.hortor.officecloud.ui;
import java.util.ArrayList;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
/**
* @author kingjxl2006@126.com
* @since 2012-10-16 上午11:18:21
*/
public class FragmentVPAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
private FragmentManager fm;
public FragmentVPAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
super(fm);
this.fm = fm;
this.fragments = fragments;
}
public void setFragments(ArrayList<Fragment> fragments) {
if(this.fragments != null){
FragmentTransaction ft = fm.beginTransaction();
for(Fragment f:this.fragments){
ft.remove(f);
}
ft.commit();
ft=null;
fm.executePendingTransactions();
}
this.fragments = fragments;
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public Fragment getItem(int arg0) {
return fragments.get(arg0);
}
@Override
public int getCount() {
return fragments.size();
}
}
另一篇文章:很多人在网上说ViewPager的PagerAdapter.notifyDataSetChanged()无效。刚开始我也这样认为,甚至被误导以为是真理。
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- (4.3.1.13)Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究或不执行OnCreatView方法导致界面不刷新
- FragmentPagerAdapter刷新notifyDataSetChanged无效
- Android FragmentPagerAdapter 数据刷新问题
- Android ListView Adapter notifyDataSetChanged 刷新没有效果
- Android ListView Adapter notifyDataSetChanged 刷新没有效果
- android FragmentPagerAdapter 无法刷新数据的解决方法
- Android FragmentStatePagerAdapter.notifyDataSetChanged()刷新数据的问题
- 【Android】从源码分析PagerAdapter/FragmentPagerAdapter调用notifydataSetChanged()刷新的原理
- notifyDataSetChanged()没效果的原因
- ListView notifyDataSetChanged()不刷新数据
- android - ListView的动态刷新问题——用notifyDataSetChanged没作用
- Duff's Device
- abap中方法file_open_dialog的使用
- What is the difference between WM_DESTROY and WM_NCDESTROY?
- ServletContext对象读取资源路径的三种方式
- [STL] __gnu_cxx::hash_map使用中的一些问题
- Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
- java 命令模式下运行jar包
- Mongodb认证设置
- 2012-2013百度搜索引擎优化大事记
- java项目公共接口GenericDao GenericDaoImpl
- Error opening terminal:xterm解决方法
- 服务端研发应具备的技能(1)
- When the normal window destruction messages are thrown for a loop
- 离线缓存更新麻烦,不如使用localStorage