Android listview 替换片段时无法加载PagerSlidingTabStrip中的选项卡
我正在尝试用PagerSlidingTabStrip而不是TabView实现viewpager。viewpager有三个选项卡,其中每个listview显示事件列表。这三个选项卡分别称为“过去”、“今晚”和“未来” 我已经按照页面所示设置了滑块:Android listview 替换片段时无法加载PagerSlidingTabStrip中的选项卡,android-listview,android-fragments,android-viewpager,Android Listview,Android Fragments,Android Viewpager,我正在尝试用PagerSlidingTabStrip而不是TabView实现viewpager。viewpager有三个选项卡,其中每个listview显示事件列表。这三个选项卡分别称为“过去”、“今晚”和“未来” 我已经按照页面所示设置了滑块: public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
View v = inflater.inflate(R.layout.all_events_main_strip, container, false);
// Set up the ViewPager, attaching the adapter and setting up a listener for when the
// user swipes between sections.
pager = (ViewPager) v .findViewById(R.id.pager_main);
tabs = (PagerSlidingTabStrip) v.findViewById(R.id.tabs);
adapter = new MyPagerAdapter(getFragmentManager());
pager.setAdapter(adapter);
tabs.setViewPager(pager);
// Set Present tab as default
pager.setCurrentItem(1);
return v;
}
当应用程序启动时,主活动第一次添加了这个片段,一切都很好。具有3个列表视图的3个可切换选项卡。(c.f.代码部分)
问题出在这里:
我注意到,当我按下后退按钮并再次替换片段时,为了重新打开VIEWPAGE,中间的选项卡没有显示任何ListVIEW。如果我键入left或right,则会加载并显示其他选项卡中的内容,但当前选项卡仍为空。 调试时,根本不调用ToNightEvents列表片段。 你们有什么解决问题的建议吗
代码: 代码的结构如下:在onCreateView之后,我添加了一个OnDestroyView方法来删除片段,但它不起作用。。。然后在fragmentPagerAdapter中,每个页面在getItem方法中被称为片段。最后,在代码末尾,您可以看到三个ListFragment类,其中listview是通过AsyncTask填充的public class FragmentAllEvents extends Fragment
{
private static final String TAG_UID = "uid";
private static final String TAG_LOGO = "logo";
private static final String TAG_POKUID = "pokuid";
static ArrayList<HashMap<String, String>> userList;
ArrayList<HashMap<String, String>> userListTotal;
private final Handler handler = new Handler();
HashMap<String, String> userSelected;
EventsFunctions eventsFunctions;
UserFunctions userFunctions;
static ListView lv;
ActionBar actionBar;
MyPagerAdapter adapter;
ViewPager pager;
PagerSlidingTabStrip tabs;
private Drawable oldBackground = null;
private int currentColor = 0xFF666666;
//Context context = this;
@Override public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Set up the action bar.
actionBar = getActivity().getActionBar();
actionBar.setHomeButtonEnabled(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
View v = inflater.inflate(R.layout.all_events_main_strip, container, false);
pager = (ViewPager) v .findViewById(R.id.pager_main);
tabs = (PagerSlidingTabStrip) v.findViewById(R.id.tabs);
adapter = new MyPagerAdapter(getFragmentManager());
pager.setAdapter(adapter);
tabs.setViewPager(pager);
pager.setCurrentItem(1);
return v;
}
@Override
public void onDestroyView()
{
super.onDestroyView();
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
}
public static class MyPagerAdapter extends FragmentPagerAdapter
{
public MyPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int i)
{
switch (i)
{
case 0:
return new PastEvents();
case 1:
return new ToNightEvents();
case 2:
return new FutureEvents();
/*default:
// The other sections of the app are dummy placeholders.
return new ToNightEvents();
*/
}
return null;
}
/**
* A fragment that launches past events list.
*/
public static class PastEvents extends ListFragment implements
PullToRefreshAttacher.OnRefreshListener
{
private ListView pastList;
private PullToRefreshAttacher mPullToRefreshAttacher;
ProgressBar progress;
String tabTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View pastView = inflater.inflate(R.layout.pastlist, container, false);
progress = (ProgressBar) pastView.findViewById(R.id.loading_spinner_past);
tabTime="past";
pastList = (ListView) pastView.findViewById(android.R.id.list);
// Now get the PullToRefresh attacher from the Activity. An exercise to the reader
// is to create an implicit interface instead of casting to the concrete Activity
mPullToRefreshAttacher = ((Home) getActivity()).getPullToRefreshAttacher();
// Now set the ScrollView as the refreshable view, and the refresh listener (this)
mPullToRefreshAttacher.addRefreshableView(pastList, this);
new AsyncLoadEvents(getActivity(), progress, pastList, mPullToRefreshAttacher).execute(tabTime);
return pastView;
}
@SuppressWarnings("unchecked")
@Override
public void onListItemClick(ListView listView, View view, int position, long id)
{
super.onListItemClick (listView, view, position, id);
HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
//Log.e("AttendList Report", "Clicked list item: " + position +" Content: \n" + map.get(TAG_ID).toString());
Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString());
Intent intent = new Intent(getActivity(), SingleEventActivity.class);
intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString();
intent.putExtra("uid", map.get(TAG_UID));
intent.putExtra("logo",map.get(TAG_LOGO));
getActivity().startActivity(intent);
}
@Override
public void onRefreshStarted(View view)
{
new AsyncLoadEvents(getActivity(), progress, pastList, mPullToRefreshAttacher).execute(tabTime);
}
}
/**
* A fragment that launches future event list.
*/
public static class FutureEvents extends ListFragment implements
PullToRefreshAttacher.OnRefreshListener
{
private ListView futureList;
private PullToRefreshAttacher mPullToRefreshAttacher;
ProgressBar progress;
String tabTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View futureView = inflater.inflate(R.layout.futurelist, container, false);
progress = (ProgressBar) futureView.findViewById(R.id.loading_spinner_future);
tabTime = "future";
futureList = (ListView) futureView.findViewById(android.R.id.list); //change to attendlist if needed
// Now get the PullToRefresh attacher from the Activity. An exercise to the reader
// is to create an implicit interface instead of casting to the concrete Activity
mPullToRefreshAttacher = ((Home) getActivity()).getPullToRefreshAttacher();
// Now set the ScrollView as the refreshable view, and the refresh listener (this)
mPullToRefreshAttacher.addRefreshableView(futureList, this);
new AsyncLoadEvents(getActivity(), progress, futureList, mPullToRefreshAttacher).execute(tabTime);
return futureView;
}
@SuppressWarnings("unchecked")
@Override
public void onListItemClick(ListView listView, View view, int position, long id)
{
super.onListItemClick (listView, view, position, id);
HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString());
Intent intent = new Intent(getActivity(), SingleEventActivity.class);
intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString();
intent.putExtra("uid", map.get(TAG_UID));
intent.putExtra("logo",map.get(TAG_LOGO));
getActivity().startActivity(intent);
}
@Override
public void onRefreshStarted(View view)
{
new AsyncLoadEvents(getActivity(), progress, futureList, mPullToRefreshAttacher).execute(tabTime);
}
}
/**
* A fragment that launches future event list.
*/
public static class ToNightEvents extends ListFragment implements
PullToRefreshAttacher.OnRefreshListener
{
private ListView tonightList;
private PullToRefreshAttacher mPullToRefreshAttacher;
ProgressBar progress;
String tabTime;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View tonightView = inflater.inflate(R.layout.tonightlist, container, false);
progress = (ProgressBar) tonightView.findViewById(R.id.loading_spinner_tonight);
tabTime = "tonight";
tonightList = (ListView) tonightView.findViewById(android.R.id.list); //change to attendlist if needed
// Now get the PullToRefresh attacher from the Activity. An exercise to the reader
// is to create an implicit interface instead of casting to the concrete Activity
mPullToRefreshAttacher = ((Home) getActivity()).getPullToRefreshAttacher();
// Now set the ScrollView as the refreshable view, and the refresh listener (this)
mPullToRefreshAttacher.addRefreshableView(tonightList, this);
new AsyncLoadEvents(getActivity(), progress, tonightList, mPullToRefreshAttacher).execute(tabTime);
return tonightView;
}
@SuppressWarnings("unchecked")
@Override
public void onListItemClick(ListView listView, View view, int position, long id)
{
super.onListItemClick (listView, view, position, id);
HashMap<String, String> map = (HashMap<String, String>) getListView().getItemAtPosition(position);
Log.e("PastList Report", "Clicked list item: " + position +" Event's content: \n" + map.get(TAG_UID).toString());
Intent intent = new Intent(getActivity(), SingleEventActivity.class);
intent.putExtra("pokuid",map.get(TAG_POKUID)); // Maybe remove attribute toString();
intent.putExtra("uid", map.get(TAG_UID));
intent.putExtra("logo",map.get(TAG_LOGO));
getActivity().startActivity(intent);
}
@Override
public void onRefreshStarted(View view)
{
new AsyncLoadEvents(getActivity(), progress, tonightList, mPullToRefreshAttacher).execute(tabTime);
}
}
public String[] titles=
{
"Past",
"Tonight",
"Future"
};
@Override
public int getCount()
{
return titles.length;
}
@Override
public CharSequence getPageTitle(int position)
{
return titles[position];
}
}
}
公共类FragmentAllEvents扩展了片段
{
私有静态最终字符串标记\u UID=“UID”;
私有静态最终字符串标记_LOGO=“LOGO”;
私有静态最终字符串标记_POKUID=“POKUID”;
静态ArrayList用户列表;
ArrayList userListTotal;
私有最终处理程序=新处理程序();
HashMap用户选择;
事件函数事件函数;
用户函数用户函数;
静态ListView lv;
ActionBar ActionBar;
MyPagerAdapter适配器;
查看寻呼机;
页面滑动选项卡;
私有可绘制oldBackground=null;
私有int currentColor=0xFF666666;
//上下文=这个;
@在创建时覆盖公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//设置操作栏。
actionBar=getActivity().getActionBar();
actionBar.setHomeButtonEnabled(真);
}
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
视图v=充气机充气(右布局、所有事件、主条、容器、假);
pager=(ViewPager)v.findviewbyd(R.id.pager\u main);
tabs=(PagerSlidingTabStrip)v.findViewById(R.id.tabs);
适配器=新的MyPagerAdapter(getFragmentManager());
寻呼机设置适配器(适配器);
tabs.setViewPager(寻呼机);
寻呼机设置当前项(1);
返回v;
}
@凌驾
公共无效onDestroyView()
{
super.onDestroyView();
getActivity().getSupportFragmentManager().beginTransaction().remove(this.commit());
}
公共静态类MyPagerAdapter扩展了FragmentPagerAdapter
{
公共MyPagerAdapter(碎片管理器fm)
{
超级(fm);
}
@凌驾
公共片段getItem(int i)
{
开关(一)
{
案例0:
返回新的PastEvents();
案例1:
返回新的ToNightEvents();
案例2:
返回新的FutureEvents();
/*默认值:
//应用程序的其他部分是虚拟占位符。
返回新的ToNightEvents();
*/
}
返回null;
}
/**
*启动过去事件列表的片段。
*/
公共静态类PasteEvents扩展ListFragment实现
PullToRefreshAttacher.OnRefreshListener
{
私有列表视图列表;
私人PullToRefreshAttacher mPullToRefreshAttacher;
进度条进度;
字符串tabTime;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
View pastView=充气机。充气(R.layout.pastlist,容器,false);
进度=(ProgressBar)pastView.findViewById(R.id.loading\u spinner\u past);
tabTime=“过去”;
pastList=(ListView)pastView.findViewById(android.R.id.list);
//现在从活动中获取PullToRefresh attacher。这是给读者的练习
//是创建一个隐式接口,而不是转换到具体的活动
mPullToRefreshAttacher=((Home)getActivity()).getPullToRefreshAttacher();
//现在将ScrollView设置为可刷新视图,并设置刷新侦听器(如下所示)
mPullToRefreshAttacher.addRefreshTableView(过去列表,此);
新建AsyncLoadEvents(getActivity()、progress、pastList、mPullToRefreshAttacher);
返回过去视图;
}
@抑制警告(“未选中”)
@凌驾
public void onListItemClick(ListView ListView、视图视图、int位置、长id)
{
super.onListItemClick(列表视图、视图、位置、id);
HashMap=(HashMap)getListView().getItemAtPosition(位置);
//Log.e(“AttendList Report”,“单击列表项:“+position+”内容:\n“+map.get(TAG_ID).toString());
Log.e(“PastList报告”,“单击列表项:“+position+”事件的内容:\n“+map.get(TAG_UID).toString());
Intent Intent=new Intent(getActivity(),SingleEventActivity.class);
intent.putExtra(“pokuid”,map.get(TAG_pokuid));//可能会删除属性toString();
intent.putExtra(“uid”,map.get(TAG_uid));
pager.invalidate();
tabs.invalidate();
pager.setAdapter(new MyPagerAdapter(getFragmentManager()));
tabs.setViewPager(pager);
adapter = new MyPagerAdapter(getChildFragmentManager());