Android - Expandable List within Fragments

有些话、适合烂在心里 提交于 2019-12-23 04:15:09

问题



Hey, I am trying to convert my existing App using Tabhost and Activities to a Action Bar based App with fragments. In this process a ran into the issue to implement Expandable Lists.

I haven´t found any simple example in the internet on how to implement this Expandable List. As ExpandableListActivity has no counterpart for fragments I think I need to use and extend ListFragment but as I am quite new to android I haven´t got any clue how. :)

I would be glad if someone could shed some light on how to use an expandable list with fragments.

Thanks.


Attached is also a snippet of my existing code.

Fragment 1 with two spinners already

public class Configurator_Fragment extends SherlockListFragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (container == null) {
    }
    final View v = inflater.inflate(R.layout.configurator_layout,
            container, false);

    final Spinner spinner = (Spinner) v
            .findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            getActivity(), R.array.array1,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    final Spinner spinner2 = (Spinner) v.findViewById(R.id.spinner2);
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(
            getActivity(), R.array.array2,
            android.R.layout.simple_spinner_item);
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner2.setAdapter(adapter2);

    return v;
}
}

FragmentActivity

public class TabActivity extends SherlockFragmentActivity  {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;


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


    if (savedInstanceState == null) {

        Fragment newFragment = new Configurator_Fragment();
        Fragment newFragment2 = new SecondFragment();

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.pager, newFragment, "First");
        ft.add(R.id.pager, newFragment2, "Second");
        ft.commit();

   }

    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tab1 = getSupportActionBar().newTab().setText("Fragment 1");
    ActionBar.Tab tab2 = getSupportActionBar().newTab().setText("Fragment 2");

    mViewPager = (ViewPager)findViewById(R.id.pager);
    mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), mViewPager);

        mTabsAdapter.addTab(tab1, Configurator_Fragment.class, null);
        mTabsAdapter.addTab(tab2, SecondFragment.class, null);


    if (savedInstanceState != null) {
        getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt("index"));
    }

}
@Override
protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);
    outState.putInt("index", getSupportActionBar().getSelectedNavigationIndex());


}
public static class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener {
    private final Context mContext;
    private final ActionBar mBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
    private FragmentTransaction mCurTransaction = null;


    static final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    public TabsAdapter(FragmentActivity activity, ActionBar bar, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mBar = bar;
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss, Bundle args) {
     TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mBar.addTab(tab);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mTabs.size();
    }


    @Override
    public Fragment getItem(int position) {
     TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

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

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
    Object tag = tab.getTag();
                for (int i=0; i<mTabs.size(); i++) {
                    if (mTabs.get(i) == tag) {

                            mViewPager.setCurrentItem(i);
                    }
                }
    }

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

    }

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

    }
 }

}

回答1:


A couple disclaimers first...

1) I haven't used ABS, so I'm not sure what changes that would make.
2) My ExpandableListView is backed by a database, not arrays. I say this becasue it looks like you are using arrays. I post this anyway in the hopes it might still provide you with some direction.

That said, I've done it simply by extending Fragment.

public class EventListFragment extends Fragment {

    private AttendanceDB mDbHelper;
    public static Cursor mGroupsCursor;
    private MyExpandableListAdapter mAdapter;
    private String mGroup;
    private String mChild;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.explistfragment, container, false);
        header = (TextView) v.findViewById(R.id.header1);
        header.setText(R.string.event_header);
        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        mGroup = extras.getString("Group");
        mChild = extras.getString("Child");
        mDbHelper = new AttendanceDB(getActivity());
        mDbHelper.open();
        fillData(mGroup, mChild);
    }

    private void fillData(String group, String child) {
        ExpandableListView lv;
        mGroupsCursor = mDbHelper.fetchGroup(group);
        getActivity().startManagingCursor(mGroupsCursor);
        mGroupsCursor.moveToFirst();
        lv = (ExpandableListView) getActivity().findViewById(R.id.explist);

        mAdapter = new MyExpandableListAdapter(mGroupsCursor, getActivity(),
                R.layout.explistlayout,
                R.layout.explistlayout1,
                new String[] { "_id" },
                new int[] { android.R.id.text1 },
                new String[] { child },
                new int[] { android.R.id.text1 });
        lv.setAdapter(mAdapter);
    }

    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {

        public MyExpandableListAdapter(Cursor cursor, Context context,
                int groupLayout, int childLayout, String[] groupFrom,
                int[] groupTo, String[] childrenFrom, int[] childrenTo) {
            super(context, cursor, groupLayout, groupFrom, groupTo,
                    childLayout, childrenFrom, childrenTo);
        }
        @Override
        protected Cursor getChildrenCursor(Cursor groupCursor) {
            Cursor childCursor = mDbHelper.fetchChildren(mGroup, groupCursor
                    .getString(groupCursor
                            .getColumnIndex(AttendanceDB.EVENT_ROWID)));
            getActivity().startManagingCursor(childCursor);
            childCursor.moveToFirst();
            return childCursor;
        }
    }

}


来源:https://stackoverflow.com/questions/11072683/android-expandable-list-within-fragments

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!