过去1天我头脑发热,但无法找到解决办法。 在我的应用程序中,工具栏下有两个选项卡
在两个选项卡中都有listView。单击 USER-TAB 上的ListItem时,会出现一个对话框,用户可以执行某些操作。
此后,当ADMIN-TAB被选中时,管理员应该使用新的数据集刷新。但事实并非如此。在选择ADMIN-TAB时,onResume()方法被调用,但是它无法更新列表。
我无法编写整个代码,我正在给一些代码片段。
基本上我从这个链接中获取了代码
https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip
在我的主要活动中,我编写了OpPageChangeListener。
public class MaterialTab extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.material_main_sample);
// Get the ViewPager and set it's PagerAdapter so that it can display items
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager()));
// Give the PagerSlidingTabStrip the ViewPager
PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
// Attach the view pager to the tab strip
tabsStrip.setViewPager(viewPager);
tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(position == 0){
MileUserFragment userFragment = new MileUserFragment();
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(userFragment);
ft.attach(userFragment);
ft.commit();
} if(position == 1){
MileAdminFragment adminFragment = new MileAdminFragment();
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(adminFragment);
ft.attach(adminFragment);
ft.commit();
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
}
OnPageSelected您可以看到我正在分离并重新附加片段。一切正常。两个片段OnResume()都被调用但List没有被更改。我不清楚为什么
如需其他帮助,我将添加一个片段片段。希望这会给我一些想法,我可能会出错
public class MileUserFragment extends Fragment {
@Override
public void onResume() {
super.onResume();
new GetAdminDbTask().execute();
if(!internetUtil.isConnectedToInternet(getActivity())){
mSwipeRefreshLayout.setRefreshing(false);
mSwipeRefreshLayout.setEnabled(false);
}
}
public class GetAdminDbTask extends AsyncTask<Admin, Void, String> {
@Override
protected String doInBackground(Admin... parmas) {
_adminList = shipmentDbHandler.getAllAdmin();
return "";
}
@Override
protected void onPostExecute(String str) {
mAdminAdapter = new AdminAdapter(getActivity(), _adminList);
adminListView.setAdapter(mAdminAdapter);
mAdminAdapter.notifyDataSetChanged();
// Set the refresh Listener to false after the list has been loaded with new set of data
if (mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
if(_adminList.size() > 0 ){
mAdminAdapter = new AdminAdapter(getActivity(), _adminList);
adminListView.setAdapter(mAdminAdapter);
mAdminAdapter.notifyDataSetChanged();
}
}
}
}
public class SampleFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 2;
private String tabTitles[] = new String[] { "Tab1", "Tab2" };
private FragmentManager fragmentManager;
public SampleFragmentPagerAdapter(FragmentManager fm) {
super(fm);
this.fragmentManager = fm;
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public Fragment getItem(int position) {
FragmentTransaction ft = null;
if(position == 0){
MileUserFragment userFragment = new MileUserFragment();
return userFragment;
}
if(position == 1){
MileAdminFragment adminFragment = new MileAdminFragment();
return archiveFragment;
}
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
}
答案 0 :(得分:1)
哈哈..最后我得到了一个失败了近一天半的答案。这可能不是完全好的答案,但至少它是我得到的最接近的答案之一。
首先,MainActivity.java看起来像:
tabs.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
int scrollPosition = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(position == 0){
scrollPosition = 0;
}
if(position == 1){
scrollPosition = 1;
}
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
if(state == pager.SCROLL_STATE_IDLE){
if(scrollPosition == 0 && application.isActiveAction()){
viewPagerAdapter.notifyDataSetChanged();
application.setActiveAction(false);
}
if(scrollPosition == 1 && application.isArchiveAction()){
viewPagerAdapter.notifyDataSetChanged();
application.setArchiveAction(false);
}
}
}
});
现在我在这里做的是设置了OnPageChangeListener,在这里我会跟踪标签变化时的位置。根据我的需要,我已经创建了两个布尔变量并在应用程序范围内这些选项卡上的任何内容发生变化时进行设置。现在,当一个选项卡上的内容已更改或某些操作已完成时,我正在调用
viewPagerAdapter.notifyDataSetChanged()//现在这是真正的宝石
调用它之后,它将调用ViewPagerAdapter函数
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE; // This will get invoke as soon as you call notifyDataSetChanged on viewPagerAdapter.
}
Point也是你的ViewPagerAdapter应该扩展FragmentStatePageAdapter。现在点是
PagerAdapter.POSITION_NONE
不会缓存片段并为该选项卡位置重新加载新片段。 基本的想法是我们不应该在每次滑动选项卡时制作或重新启动PagerAdapter.POSITION_NONE,因为它会破坏缓存的元素并重新加载影响UI性能的片段。
所以最后基本的事情总是检查是否在调用 viewPagerAdapter.notifyDataSetChanged() 函数 getItemPosition() < / strong>也应该被调用。希望它会对某人有所帮助。为了获得更好的性能,您可以根据需要进行更改。
我从这篇文章中得到了所需的突破和理解: @Louth 答案
Remove Fragment Page from ViewPager in Android
答案 1 :(得分:0)
只需放
viewPager.setCurrentItem(tab.getPosition());
在您的onTabSelected
方法中,例如:
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});