解决Fragment切换时实例化加载数据问题

在做项目的时候,遇到fragment切换时,每次都重新在网络上加载数据。在网上查了很多相关资料,现总结一下解决办法。
布局文件和QQ主界面类似,布局对应的java类命名为:HomeActivity。
布局代码如下:
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".HomeActivity" >

    <FrameLayout
        android:id="@+id/home_fl"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </FrameLayout>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="#C8C8C8" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="66dp"
        android:background="#F7F7F7" >

        <RadioGroup
            android:id="@+id/home_rg"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal" >

            <RadioButton
                android:id="@+id/home_rb_one"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:checked="true"
                android:drawableTop="@drawable/left_selector"
                android:gravity="center"
                android:scaleX="0.9"
                android:scaleY="0.9"
                android:text="首页"
                android:textColor="@drawable/text_color_selector"
                android:textSize="16sp" />

            <RadioButton
                android:id="@+id/home_rb_two"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/find_selector"
                android:gravity="center"
                android:scaleX="0.9"
                android:scaleY="0.9"
                android:text="发现"
                android:textColor="@drawable/text_color_selector"
                android:textSize="16sp" />

            <RadioButton
                android:id="@+id/home_rb_three"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/choose_selector"
                android:gravity="center"
                android:scaleX="0.9"
                android:scaleY="0.9"
                android:text="原创"
                android:textColor="@drawable/text_color_selector"
                android:textSize="16sp" />

            <RadioButton
                android:id="@+id/home_rb_four"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:button="@null"
                android:drawableTop="@drawable/mine_selector"
                android:gravity="center"
                android:scaleX="0.9"
                android:scaleY="0.9"
                android:text="我的"
                android:textColor="@drawable/text_color_selector"
                android:textSize="16sp" />
        </RadioGroup>
    </RelativeLayout>

</LinearLayout>
当然framelayout部分要加载4个布局,在这儿就不贴代码了。我将4个布局对应的java类依次命名为:Fragment_Home、Fragment_Two、Fragment_Mine、Fragment_Three。
在HomeActivity中:
// 声明fragment
    private Fragment_Home home = new Fragment_Home();
    private Fragment_Mine mine = new Fragment_Mine();
    private Fragment_Two two = new Fragment_Two();
    private Fragment_Three three = new Fragment_Three();
    private FragmentManager manager;
    private FragmentTransaction transaction;
    private Fragment start, end;
//start存放初始界面,end存放点击底部Radiobutton后加载的界面。
// 设置默认显示
        manager = getFragmentManager();
        transaction = manager.beginTransaction();
        home = new Fragment_Home();
        transaction.replace(R.id.home_fl, home);
        transaction.commit();
        start = home;
        end = null;

然后对主界面中的radiogroup设置监听,使得点击时加载不同的界面到framelayout,代码如下:

// 对radiogroup设置监听
        home_rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // TODO Auto-generated method stub
                manager = getFragmentManager();
                transaction = manager.beginTransaction();
                switch (checkedId) {
                case R.id.home_rb_one:
                    end = home;
                    if (start != end) {

                        if (!end.isAdded()) {
                            transaction.hide(start).add(R.id.home_fl, end);
                        } else {
                            transaction.hide(start).show(end);
                        }
                        start = end;
                    }
                    break;
                case R.id.home_rb_two:
                    end = two;
                    if (start != end) {

                        if (!end.isAdded()) {
                            transaction.hide(start).add(R.id.home_fl, end);
                        } else {
                            transaction.hide(start).show(end);
                        }
                        start = end;
                    }
                    break;
                case R.id.home_rb_three:
                    end = three;
                    if (start != end) {
                        if (!end.isAdded()) {
                            transaction.hide(start).add(R.id.home_fl, end);
                        } else {
                            transaction.hide(start).show(end);
                        }
                        start = end;
                    }
                    break;
                case R.id.home_rb_four:
                    end = mine;
                    if (start != end) {
                        if (!end.isAdded()) {
                            transaction.hide(start).add(R.id.home_fl, end);
                        } else {
                            transaction.hide(start).show(end);
                        }
                        start = end;
                    }
                    break;

                }
                transaction.commit();
            }

        });

这样,当fragment中要从网络中获取数据时,点击切换fragment,数据将不会重新加载。代码有重复部分,可以封装成一个方法进行调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值