Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.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 从主活动加载片段中的listview项_Android_Android Fragments - Fatal编程技术网

Android 从主活动加载片段中的listview项

Android 从主活动加载片段中的listview项,android,android-fragments,Android,Android Fragments,我是android编程的新手。我在我的主要活动中添加了三个片段,如下所示。每个片段包含一个列表视图。列表视图中的项目是从json输出添加的。现在我需要从每个片段调用相同的json请求。我可以从我的主要活动中设置列表视图项目吗?避免2个json请求 @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class MainActivity extends ActionBarActivity implements android.suppo

我是android编程的新手。我在我的主要活动中添加了三个片段,如下所示。每个片段包含一个列表视图。列表视图中的项目是从json输出添加的。现在我需要从每个片段调用相同的json请求。我可以从我的主要活动中设置列表视图项目吗?避免2个json请求

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends ActionBarActivity implements
        android.support.v7.app.ActionBar.TabListener {
    ViewPager viewPager;

    // Using appcompat action bar
    private android.support.v7.app.ActionBar actionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager) findViewById(R.id.pager);
        FragmentManager fragmnetManager = getSupportFragmentManager();
        viewPager.setAdapter(new MyAdapter(fragmnetManager));

        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
        {
            @Override
            public void onPageSelected(int pos)
            {
                actionBar.setSelectedNavigationItem(pos);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2)
            {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

        // Getting actionbar
        actionBar = getSupportActionBar();

        // Setting navigation mode to actionbar
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Now adding a new tab to action bar and setting title, icon and
        // implementing listener
        android.support.v7.app.ActionBar.Tab tab1 = actionBar.newTab();
        tab1.setText("TAB1");
        // tab1.setIcon(R.drawable.ic_launcher);
        tab1.setTabListener(this);

        android.support.v7.app.ActionBar.Tab tab2 = actionBar.newTab();
        tab2.setText("TAB2");
        tab2.setTabListener(this);

        android.support.v7.app.ActionBar.Tab tab3 = actionBar.newTab();
        tab3.setText("TAB3");
        tab3.setTabListener(this);

        // Now finally adding all tabs to actionbar
        actionBar.addTab(tab1);
        actionBar.addTab(tab2);
        actionBar.addTab(tab3);

    }

    @Override
    public void onTabReselected(android.support.v7.app.ActionBar.Tab arg0,
                                FragmentTransaction arg1)
    {

    }

    @Override
    public void onTabSelected(android.support.v7.app.ActionBar.Tab tab,
                              FragmentTransaction arg1)
    {

        // Setting current position of tab to view pager
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(android.support.v7.app.ActionBar.Tab arg0,
                                FragmentTransaction arg1) {

    }

}

// My adapter i.e. custom adapter for displaying fragments over view pager
class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);

    }

    @Override
    public Fragment getItem(int i) {

        // Getting fragments according to selected position
        Fragment fragment = null;
        if (i == 0) {
            fragment = new FragmentA();
        }
        if (i == 1) {
            fragment = new FragmentB();
        }
        if (i == 2) {
            fragment = new FragmentC();
        }

        // and finally returning fragments
        return fragment;
    }

    @Override
    public int getCount() {

        // Returning no. of counts of fragments
        return 3;
    }
}

是的,你可以。在mainActivity中创建一个界面,如下所示

     public interface Communicator{
        void onDataLoaded(<Whatever data you want to send to fragment>)
       }
      mCommunicator=(Communicator)fragment;
在getItem方法中,要为哪个片段发送数据以初始化通信器,如下所示

     public interface Communicator{
        void onDataLoaded(<Whatever data you want to send to fragment>)
       }
      mCommunicator=(Communicator)fragment;
然后在主活动中,一旦加载了JSON,只需调用mCommunicator.onDataLoaded()


确保你的片段实现了这个接口。一旦您实现了它,您将在那里获得数据,您可以更新您的listview。

是的,您可以。在mainActivity中创建一个界面,如下所示

     public interface Communicator{
        void onDataLoaded(<Whatever data you want to send to fragment>)
       }
      mCommunicator=(Communicator)fragment;
在getItem方法中,要为哪个片段发送数据以初始化通信器,如下所示

     public interface Communicator{
        void onDataLoaded(<Whatever data you want to send to fragment>)
       }
      mCommunicator=(Communicator)fragment;
然后在主活动中,一旦加载了JSON,只需调用mCommunicator.onDataLoaded()


确保你的片段实现了这个接口。一旦您实现了它,您将在那里获得数据,并且您可以更新您的listview。

如果您不想实现接口,您也可以尝试这个方法(因为您只有三个片段)-为了避免在不同的片段上出现两个json请求,只需发送一个json请求,然后在两个不同的列表中获得数据,您可以在第二个片段中调用一个方法,在第一个片段的第二个片段中设置listview的数据

假设您从jsonResponse获得两个数据列表(firstList,secondList),然后在currentFragment中设置第一个arraylist,并在第二个片段中设置数据,请尝试下面的方法-

在活动中定义片段的实例,如-

FirstFragment firstFragment;
SecondFragment secondFragment;
在添加片段的地方初始化它们,如-

secondFragment = new SecondFragment();
第二段-

public void updateListView(ArrayList list){
secondArrayList.addAll(list);
secondAdapter = new Adapter(superContext, R.layout.single_item, secondArrayList);
listView.setAdapter(secondAdapter);
}
从活动调用此方法-

secondFragment.updateListView(secondList);

如果您的片段数量较小,则此解决方案更好。

如果您不想实现接口,也可以尝试此方法(因为您只有三个片段)-为了避免在不同片段上出现两个json请求,只需发送一个json请求,然后在两个不同列表中获取数据,您可以在第二个片段中调用一个方法,在第一个片段的第二个片段中设置listview的数据

假设您从jsonResponse获得两个数据列表(firstList,secondList),然后在currentFragment中设置第一个arraylist,并在第二个片段中设置数据,请尝试下面的方法-

在活动中定义片段的实例,如-

FirstFragment firstFragment;
SecondFragment secondFragment;
在添加片段的地方初始化它们,如-

secondFragment = new SecondFragment();
第二段-

public void updateListView(ArrayList list){
secondArrayList.addAll(list);
secondAdapter = new Adapter(superContext, R.layout.single_item, secondArrayList);
listView.setAdapter(secondAdapter);
}
从活动调用此方法-

secondFragment.updateListView(secondList);
如果碎片数量较小,此解决方案会更好