ViewPager動態替換數據源------Fragment

鳴謝:參考博客: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());
    }
}

就這樣,有問題歡迎留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章