从主要活动

时间:2016-03-17 06:33:48

标签: android android-fragments

我是android编程的新手。我在我的主要活动中添加了三个片段,如下所示。每个片段都包含一个列表视图。列表视图中的项目是从json输出中添加的。现在我需要从每个片段调用相同的json请求碎片。我可以从我的主要活动中设置listview项目吗?并避免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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

     public interface Communicator{
        void onDataLoaded(<Whatever data you want to send to fragment>)
       }

现在在主要活动中创建此接口的实例

     Communicator mCommunicator;

在你的getItem方法中,要为哪个片段发送数据以初始化通信器,如下所示

      mCommunicator=(Communicator)fragment;

然后在您的主要活动中加载JSON后,只需调用mCommunicator.onDataLoaded();

确保您的片段实现此接口。实施后,您将获得数据,并可以更新列表视图。

答案 1 :(得分:1)

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

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

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

FirstFragment firstFragment;
SecondFragment secondFragment;

将它们初始化为添加片段的位置 -

secondFragment = new SecondFragment();
在SecondFragment中

-

public void updateListView(ArrayList list){
secondArrayList.addAll(list);
secondAdapter = new Adapter(superContext, R.layout.single_item, secondArrayList);
listView.setAdapter(secondAdapter);
}

从活动中调用此方法 -

secondFragment.updateListView(secondList);

如果你的碎片数量很少,这个解决方案会更好。