鳴謝:參考博客:http://blog.csdn.net/z13759561330/article/details/40737381
現在就直接上代碼吧,其實原理我也沒太懂,剛好實現了,急用的話可以拿去直接用,空閒了去看看我上面鳴謝的博客吧
適配器Adapter
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.ViewGroup;
import java.util.List;
/**
* Created by PersonalFolder on 17/4/1.
*/
public class FragAdapter extends FragmentPagerAdapter {
private FragmentManager mFm;
private List<Fragment> mFragments;
private Fragment replaceFragment;
private int mPosition;
private boolean canReplace;
public FragAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
// TODO Auto-generated constructor stub
this.mFm=fm;
this.mFragments=fragments;
}
/**
* 動態替換fragment,可直接調用
* @param position 指定替換已有fragment的position,第一個是0;
* @param fragment 待替換的新的Fragment;
*/
public void replaceFragment(int position,Fragment fragment){
if (position>=0&&position<mFragments.size()) {
this.replaceFragment = fragment;
this.mPosition = position;
canReplace = true;
this.notifyDataSetChanged();
}
}
@Override
public int getItemPosition(Object object) {
//TODO 這是重點繼續研究
//return super.getItemPosition(object);//默認是不改變
return POSITION_NONE;//可以即時刷新看源碼
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//得到緩存的fragment
Fragment fragment = (Fragment) super.instantiateItem(container,
position);
//得到tag,這點很重要
String fragmentTag = fragment.getTag();
if (canReplace&&mPosition==position) {
//如果這個fragment需要更新
FragmentTransaction ft = mFm.beginTransaction();
//移除舊的fragment
ft.remove(fragment);
//換成新的fragment
fragment = replaceFragment;
//添加新fragment時必須用前面獲得的tag,這點很重要
ft.add(container.getId(), fragment, fragmentTag);
ft.attach(fragment);
ft.commit();
//復位更新標誌
canReplace=false;
}
return fragment;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return mFragments.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mFragments.size();
}
}
多說一句,適配器裏面的重點代碼是getItemPosition()和instantiateItem()這兩個方法是原理核心部分。replaceFragment()方法已封裝可直接調用;
接下來,看看怎麼封裝調用的
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.ListFragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Button mainReplace;
private ViewPager mainViewPager;
private List<Fragment> fragmentList;
private FragAdapter fragAdapter;
private static final int REPLACE_TAG = 0X12;
private Handler mainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO 自動生成的方法存根
super.handleMessage(msg);
switch (msg.what) {
case REPLACE_TAG:
fragAdapter.replaceFragment(1, new ThirdFragment());
break;
default:
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mainReplace = (Button) findViewById(R.id.main_replace);
mainViewPager = (ViewPager) findViewById(R.id.main_viewpager);
mainViewPager.setAdapter(fragAdapter = new FragAdapter(getSupportFragmentManager(), fragmentList));
mainReplace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//如果操作比較耗時使用handler //mainHandler.sendEmptyMessage(REPLACE_TAG);
//一般的操作直接執行
fragAdapter.replaceFragment(1, new ThirdFragment());
}
});
}
private void initView() {
fragmentList = new ArrayList<>();
fragmentList.add(new FirstFragment());
fragmentList.add(new SecondFragment());
}
}
就這樣,有問題歡迎留言