Android的 - 片段内扩展列表 [英] Android - Expandable List within Fragments
问题描述
嘿,我想我现有的应用程序中使用Tabhost与活动转换成基于操作栏应用程序与片段。在此过程中跑进问题来实现扩展列表。
我haven't发现任何简单的例子,在互联网上如何实现这种扩展列表。由于ExpandableListActivity没有对应的内容片断,我想我需要使用和扩展ListFragment但我很新到Android我haven't有任何线索如何。 :)
我会很高兴,如果有人可以阐明如何使用碎片可扩展列表的一些情况。
感谢。
附件也是我现有的code片段。
片段1两个微调已经
公共类Configurator_Fragment扩展SherlockListFragment {
@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
捆绑savedInstanceState){
如果(集装箱== NULL){
}
最后的视图V = inflater.inflate(R.layout.configurator_layout,
集装箱,FALSE); 最后的微调微调=(微调)V
.findViewById(R.id.spinner1);
ArrayAdapter<&CharSequence的GT;适配器= ArrayAdapter.createFromResource(
getActivity(),R.array.array1,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(适配器); 最后的微调spinner2 =(微调)v.findViewById(R.id.spinner2);
ArrayAdapter<&CharSequence的GT;适配器2 = ArrayAdapter.createFromResource(
getActivity(),R.array.array2,
android.R.layout.simple_spinner_item);
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(适配器2); 返回伏;
}
}
FragmentActivity
公共类TabActivity扩展SherlockFragmentActivity {
ViewPager mViewPager;
TabsAdapter mTabsAdapter;
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.tab_navigation);
如果(savedInstanceState == NULL){ 片段newFragment =新Configurator_Fragment();
片段newFragment2 =新SecondFragment(); FragmentTransaction英尺= getSupportFragmentManager()调用BeginTransaction()。
ft.add(R.id.pager,newFragment,第一);
ft.add(R.id.pager,newFragment2,二);
ft.commit(); } 。getSupportActionBar()setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab TAB1 = getSupportActionBar()newTab()的setText(片段1)。。
ActionBar.Tab TAB2 = getSupportActionBar()newTab()的setText(片段2)。。 mViewPager =(ViewPager)findViewById(R.id.pager);
mTabsAdapter =新TabsAdapter(这一点,getSupportActionBar(),mViewPager); mTabsAdapter.addTab(TAB1,Configurator_Fragment.class,NULL);
mTabsAdapter.addTab(TAB2,SecondFragment.class,NULL);
如果(savedInstanceState!= NULL){
。getSupportActionBar()setSelectedNavigationItem(savedInstanceState.getInt(指数));
}}
@覆盖
保护无效的onSaveInstanceState(捆绑outState){ super.onSaveInstanceState(outState);
outState.putInt(指数,getSupportActionBar()getSelectedNavigationIndex());
}
公共静态类TabsAdapter扩展FragmentPagerAdapter实现ViewPager.OnPageChangeListener,ActionBar.TabListener {
私人最终上下文mContext;
私人最终动作条毫巴;
私人最终ViewPager mViewPager;
私人最终的ArrayList< TabInfo> mTabs =新的ArrayList< TabInfo>();
私人FragmentTransaction mCurTransaction = NULL;
静态final类TabInfo {
私人最终级<> CLSS;
私人最终捆绑ARGS; TabInfo(类<> _class,捆绑_args){
CLSS = _class;
ARGS = _args;
}
} 公共TabsAdapter(FragmentActivity活动,动作条酒吧,ViewPager寻呼机){
超级(activity.getSupportFragmentManager());
mContext =活动;
毫巴=栏;
mViewPager =寻呼机;
mViewPager.setAdapter(本);
mViewPager.setOnPageChangeListener(本);
} 公共无效addTab(ActionBar.Tab标签,类&LT ;?扩展片断> CLSS,捆绑参数){
TabInfo信息=新TabInfo(CLSS,参数);
tab.setTag(信息);
tab.setTabListener(本);
mTabs.add(信息);
mBar.addTab(标签);
notifyDataSetChanged();
} @覆盖
公众诠释的getCount(){
返回mTabs.size();
}
@覆盖
公共片段的getItem(INT位置){
TabInfo信息= mTabs.get(位置);
返回Fragment.instantiate(mContext,info.clss.getName(),info.args);
} @覆盖
公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){ } @覆盖
公共无效使用onPageSelected(INT位置){
mBar.setSelectedNavigationItem(位置);
} @覆盖
公共无效onPageScrollStateChanged(INT状态){
} @覆盖
公共无效onTabSelected(标签选项卡,FragmentTransaction英尺){
对象标记= tab.getTag();
的for(int i = 0; I< mTabs.size();我++){
如果(mTabs.get(ⅰ)==标签){ mViewPager.setCurrentItem(ⅰ);
}
}
} @覆盖
公共无效onTabUnselected(标签选项卡,FragmentTransaction英尺){ } @覆盖
公共无效onTabReselected(标签选项卡,FragmentTransaction英尺){ }
}}
一对夫妇免责声明第一...
1)我没有用ABS,所以我不知道什么样的变化,这将使。结果
2)我ExpandableListView由数据库,而不是阵列的支持。我说这becasue它看起来像你使用数组。我的希望反正发布此它可能仍然为你提供一些方向。
这是说,我只是通过延长片段做了。
公共类EventListFragment扩展片段{ 私人AttendanceDB mDbHelper;
公共静态光标mGroupsCursor;
私人MyExpandableListAdapter mAdapter;
私人字符串mgroup首项;
私人字符串mChild; @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
捆绑savedInstanceState){
视图V = inflater.inflate(R.layout.explistfragment,集装箱,FALSE);
标题=(TextView中)v.findViewById(R.id.header1);
header.setText(R.string.event_header);
返回伏;
} @覆盖
公共无效onActivityCreated(捆绑savedInstanceState){
super.onActivityCreated(savedInstanceState);
捆绑额外= getIntent()getExtras()。
mgroup首项= extras.getString(「本集团」);
mChild = extras.getString(子);
mDbHelper =新AttendanceDB(getActivity());
mDbHelper.open();
fillData(mgroup首项,mChild);
} 私人无效fillData(弦乐群,串儿){
ExpandableListView LV;
mGroupsCursor = mDbHelper.fetchGroup(组);
。getActivity()startManagingCursor(mGroupsCursor);
mGroupsCursor.moveToFirst();
LV =(ExpandableListView)getActivity()findViewById(R.id.explist)。 mAdapter =新MyExpandableListAdapter(mGroupsCursor,getActivity()
R.layout.explistlayout,
R.layout.explistlayout1,
新的String [] {_id},
新的INT [] {} android.R.id.text1,
新的String [] {}孩子,
新的INT [] {android.R.id.text1});
lv.setAdapter(mAdapter);
} 公共类MyExpandableListAdapter扩展SimpleCursorTreeAdapter { 公共MyExpandableListAdapter(光标指针,上下文的背景下,
INT的GroupLayout,诠释childLayout,字符串[] groupFrom,
INT [] groupTo,字符串[] childrenFrom,INT [] childrenTo){
超(背景下,光标的GroupLayout,groupFrom,groupTo,
childLayout,childrenFrom,childrenTo);
}
@覆盖
保护光标getChildrenCursor(光标groupCursor){
光标childCursor = mDbHelper.fetchChildren(mgroup首项,groupCursor
.getString(groupCursor
.getColumnIndex(AttendanceDB.EVENT_ROWID)));
。getActivity()startManagingCursor(childCursor);
childCursor.moveToFirst();
返回childCursor;
}
}}
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) {
}
}
}
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;
}
}
}
这篇关于Android的 - 片段内扩展列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!