带有片段生命周期的选项卡

时间:2014-08-19 11:02:43

标签: java android listview android-fragments

在我的应用程序中,我有一个带片段类的Tabs。我试图刷新listView in"片段a"我插入新数据。 在"片段b"我有EditText和Button,它将文本插入数据库。 in"片段a"我有ListView与dataBase行。当"片段化"是" OnCreateView"我只是将数据库放在" ArrayList"并将它传递给我的baseAdapter。 但是" onCreateView"每当我进入"片段a"而不是刷新我的新数据否则我会去"片段c"和" onDestroy"呼吁"片段化"。 所以我的结果是打电话:" setUserVisibleHint"覆盖方法,并检查它是否可见并刷新列表。 但我认为这不是好的做法。

enter image description here

我该怎么办?

A类

  public class ListFragment extends Fragment{

        basAdapterCustom adapter;
        ListView lv;
        ArrayList<Clock> list;
        private DbHandler hand;
        Context context;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.list_fragment, container, false);
            context = getActivity();

            Log.d(TAG, "onCreateView");

            hand = new DbHandler(context);
            list = new ArrayList<Clock>();

            lv = (ListView) v.findViewById(R.id.listOfShifts);
            adapter = new basAdapterCustom(list, getActivity());
            lv.setAdapter(adapter);
            refreshList();
            return v;
        }



        //like on "resume":
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            // Make sure that we are currently visible
            if (this.isVisible()) {
                refreshList();
                if (!isVisibleToUser) {
                    // TODO stop
                }
            }
        }



        private void refreshList() {

            list = hand.getByWorkName();
            adapter = new basAdapterCustom(list,getActivity());

            lv.setAdapter(adapter);
        }

b级:

public class ClockFragment extends Fragment{


    DbHandler hand;


    Context context;
    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.clock, container,false);

        context = getActivity();

        hand = new DbHandler(context);

        return v;
    }


    // ADD to .Db
    public void addToDb(View v){
        hand.add(new Clock(0, dateDay));    

    }


}

class mainActivity:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener, OnPageChangeListener{

    public static final String TAG = "myClock";

    String[] tabMenu = {"FRAG A","FRAG B","FRAG C"};

    private ViewPager viewPager;
    private TabPagerAdapter mAdapter;
    private ActionBar actionBar;


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





        Log.d(MainActivity.TAG, "OnCreate = MainActivity (Pager");
        viewPager = (ViewPager) findViewById(R.id.pager );
        actionBar = getActionBar();
        mAdapter = new TabPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        for (String tabsNames : tabMenu) {
            actionBar.addTab(actionBar.newTab().setText(tabsNames).setTabListener(this));
        }
        viewPager.setOnPageChangeListener(this);

    }

    //  public void transDialog(){
    //      Dialog mDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
    //  }





    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }




    @Override
    public void onPageScrollStateChanged(int arg0) {        
    }


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


    @Override
    public void onPageSelected(int position) {
        actionBar.setSelectedNavigationItem(position);      
    }

}

PagetAdapter.class

public class TabPagerAdapter extends FragmentPagerAdapter {

    private static final String TAG = "myClock";


    public TabPagerAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int index) {
        Log.d(TAG, " CLASS : TabPagerAdapter");
        switch (index) {
        case 0:

            return new ListFragment();
        case 1:
            return new ClockFragment();
        case 2:
            return new SettingFragment();

        default:
            break;
        }       
        Log.d(TAG, " CLASS : TabPagerAdapter = "+index);
        return null;
    }


    @Override
    public int getCount() {
        return 3;
    }

}

请帮帮我,希望你明白我的问题......

1 个答案:

答案 0 :(得分:0)

你想在片段b中插入数据后更新片段A中的listView吗?然后你有几个解决方案可供选择:
1。通过活动实现片段之间的通信。然后B插入日期,它向活动发送消息,该数据需要更新。然后片段A开始,它要求活动需要更新数据。有关实施此通信的详细信息,请检查link 2. 使用一些总线库,例如EventBus。然后片段B插入数据,它将'data changed'事件发布到总线。片段A检查是否发生此事件 3。使用Loaders“监控其数据来源,并在内容发生变化时提供新结果。”