Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 适配器更改时FragmentTabHost中的列表片段未更新_Android_Android Fragments_Android Listfragment_Fragment Tab Host - Fatal编程技术网

Android 适配器更改时FragmentTabHost中的列表片段未更新

Android 适配器更改时FragmentTabHost中的列表片段未更新,android,android-fragments,android-listfragment,fragment-tab-host,Android,Android Fragments,Android Listfragment,Fragment Tab Host,我有一个FragmentActivity,它包含一个片段。 此片段包含FragmentTabHost。 选项卡主机包含三个选项卡,每个选项卡都是一个ListFragment 这些列表配置了自定义适配器,用于从主FragmentActivity获取更新,并在更新时调用notifyDatasetChanged 我的问题是,ListFragment UI在显示视图时似乎从不更新视图。 如果我更改选项卡-我可以看到列表更新,但当列表显示在屏幕上时,我无法实时看到更新 这是包含FragmentTabHos

我有一个FragmentActivity,它包含一个片段。 此片段包含FragmentTabHost。 选项卡主机包含三个选项卡,每个选项卡都是一个ListFragment

这些列表配置了自定义适配器,用于从主FragmentActivity获取更新,并在更新时调用notifyDatasetChanged

我的问题是,ListFragment UI在显示视图时似乎从不更新视图。 如果我更改选项卡-我可以看到列表更新,但当列表显示在屏幕上时,我无法实时看到更新

这是包含FragmentTabHost的片段的定义:

public class SubOptionFragmentManager extends Fragment 
{
    FragmentTabHost mTabHost;
    SoiListFragment mFrag1;
    SoiListFragment mFrag2;
    SoiListFragment mFrag3;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        return inflater.inflate(R.layout.soi_container, container, false);
    }

    public void init(FragmentManager fm, int optionInstanceID) 
    {
        mOptionInstanceID = optionInstanceID;

        // find and setup the tabhost
        mTabHost = (FragmentTabHost)getActivity().findViewById(android.R.id.tabhost);
        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);

        // add the three tabs
        mTabHost.addTab(mTabHost.newTabSpec("1")
                        .setIndicator("1"),
                        SoiListFragment.class,
                        getTabBundle("1", optionInstanceID));

        mTabHost.addTab(mTabHost.newTabSpec(dsTag)
                .setIndicator("2"),
                SoiListFragment.class,
                getTabBundle("2", optionInstanceID));

        mTabHost.addTab(mTabHost.newTabSpec("3")
                .setIndicator("3"),
                SoiListFragment.class,
                getTabBundle("3", optionInstanceID));

        // get reference to the fragments added
        mFrag1 = (SoiListFragment)getChildFragmentManager().findFragmentByTag("1");
        mFrag2 = (SoiListFragment)getChildFragmentManager().findFragmentByTag("2");
        mFrag3 = (SoiListFragment)getChildFragmentManager().findFragmentByTag("3");
    }

    public void HandleSoiItemUpdate(SubOptionInstanceItem soi, int fragID)
    {
        Log.i(TAG, "ItemUpdate:" + soi.toString());
        updateItemRunnable ur = new updateItemRunnable(soi, int fragID);

        getActivity().runOnUiThread(ur);
    }

    class updateItemRunnable implements Runnable
    {
        SubOptionInstanceItem mItem;
        int mFragID;

        public updateItemRunnable (SubOptionInstanceItem item, int fragID)
        {
            mItem = item;
        }

        public void run() 
        {
            switch (mFragID)
            {
                // the second parameter - true means it calls notifyDatasetChanged() after updating the item
                case 1:
                    mFrag1.getAdapter().updateItem(mItem, true);
                break;
                case 2:
                    mFrag2.getAdapter().updateItem(mItem, true);
                break;
                case 3:
                    mFrag3.getAdapter().updateItem(mItem, true);
                break;
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/background" >

    <android.support.v4.app.FragmentTabHost
        android:id="@android:id/tabhost"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />

    </android.support.v4.app.FragmentTabHost>

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

</LinearLayout>
该类中还包括ListFragment对象:

public static class SoiListFragment extends ListFragment
    {
        private int mOptionInstanceID; 
        private int mPageType;


        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);

            mOptionInstanceID = getArguments().getInt(FIELD_OPTION_INSTANCE_ID);
            mPageType = getArguments().getInt(FIELD_PAGE_TYPE);
        }

        public SubOptionInstanceAdapter getAdapter() 
        {
            return (SubOptionInstanceAdapter)getListAdapter();
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            // inflate the list view and return it
            View v = inflater.inflate(R.layout.soi_list, container, false);

            init();

            return v;
        }

        public void init()
        {
            SubOptionInstanceAdapter mAdapter = null;

            switch(mPageType)
            {
                case 1:
                    mAdapter = new SubOptionInstanceAdapter(getActivity(), 
                                                            R.layout.soi_item, 
                                                            Globals.getList1());
                break;
                case 2:
                    mAdapter = new SubOptionInstanceAdapter(getActivity(), 
                                                            R.layout.soi_item, 
                                                            Globals.getList2());
                break;
                case 3:
                    mAdapter = new SubOptionInstanceAdapter(getActivity(), R.layout.soi_item, Globals.getList3());
                break;
            }

            setListAdapter(mAdapter);
        }
片段布局“soi_container.xml”(包含FragmentTabHost的简单布局):


我的第一个问题是
init()
onCreateView
部件上的位置。 这导致每次加载或更改选项卡时都会出现
init()

另外,在容器中获取
init()
上的ListFragments引用是错误的,因为此时还没有创建片段

最后,我的解决方案是在
OnStart
事件期间在容器片段上创建选项卡,获取列表片段引用,并在
onTabCreated
事件中使用适配器初始化它们,然后使用之前获得的引用更新它们

编辑:Ravi的代码示例-获取列表片段引用

public void onTabCreated(int pageType)
{
    // if I don't already have the reference for the fragment
    if (mFrag1 == null)
    {
        mFrag1 = (SoiListFragment)getFragmentManager().findFragmentByTag("1");
    }
}

请你把代码贴在哪里,你可以在onTabCreated下获得引用吗?我有点困在获取片段的引用上了