更新视图寻呼机中更改的选项卡上的内容
Updating the contents on tab changed in view pager
过去 1 天我一直在绞尽脑汁,但找不到解决方案。
在我的应用程序中,工具栏下有两个选项卡
- 第一个标签是 USER-TAB
- 第二个是ADMIN-TAB
在这两个选项卡中都有 listView。单击 USER-TAB 上的 ListItem 时,会出现一个对话框,用户可以执行一些操作。
Now after this when the ADMIN-TAB is Selected the Admin should get refreshed with new sets of data.但事实并非如此。在选择 ADMIN-TAB 时,onResume() 方法和 everyting 被调用,但它无法更新列表。
我无法编写完整的代码,我给出了一些片段。
基本上我已经从这个 link 中获取了代码
https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip
在 My Main Activity 我写了 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 您可以看到我正在分离和重新连接 fragment.Everything 工作正常。两个 Fragments 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];
}
}
哈.. 在输了将近 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() // Now this is the real gem
调用此函数后,它将调用 ViewPagerAdapter 函数
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE; // This will get invoke as soon as you call notifyDataSetChanged on viewPagerAdapter.
}
还有一点是您的 ViewPagerAdapter 应该扩展 FragmentStatePageAdapter。现在重点是
PagerAdapter.POSITION_NONE
不会缓存片段并为该选项卡位置重新加载新片段。
基本思想是我们不应该每次在选项卡滑动时制作或返回 PagerAdapter.POSITION_NONE,因为它会破坏缓存的元素并重新加载影响 UI 性能的片段。
所以最后最基本的事情总是检查是否调用 viewPagerAdapter.notifyDataSetChanged() 函数 getItemPosition() 也应该被调用。希望它能帮助别人。为了更好的性能,您可以根据您的要求进行更改。
我从这个post得到了需要的突破和理解:@Louth回答
Remove Fragment Page from ViewPager in Android
就把
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) {
}
});
过去 1 天我一直在绞尽脑汁,但找不到解决方案。 在我的应用程序中,工具栏下有两个选项卡
- 第一个标签是 USER-TAB
- 第二个是ADMIN-TAB
在这两个选项卡中都有 listView。单击 USER-TAB 上的 ListItem 时,会出现一个对话框,用户可以执行一些操作。
Now after this when the ADMIN-TAB is Selected the Admin should get refreshed with new sets of data.但事实并非如此。在选择 ADMIN-TAB 时,onResume() 方法和 everyting 被调用,但它无法更新列表。
我无法编写完整的代码,我给出了一些片段。
基本上我已经从这个 link 中获取了代码
https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip
在 My Main Activity 我写了 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 您可以看到我正在分离和重新连接 fragment.Everything 工作正常。两个 Fragments 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];
}
}
哈.. 在输了将近 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() // Now this is the real gem
调用此函数后,它将调用 ViewPagerAdapter 函数
@Override
public int getItemPosition(Object object) {
return PagerAdapter.POSITION_NONE; // This will get invoke as soon as you call notifyDataSetChanged on viewPagerAdapter.
}
还有一点是您的 ViewPagerAdapter 应该扩展 FragmentStatePageAdapter。现在重点是
PagerAdapter.POSITION_NONE
不会缓存片段并为该选项卡位置重新加载新片段。 基本思想是我们不应该每次在选项卡滑动时制作或返回 PagerAdapter.POSITION_NONE,因为它会破坏缓存的元素并重新加载影响 UI 性能的片段。
所以最后最基本的事情总是检查是否调用 viewPagerAdapter.notifyDataSetChanged() 函数 getItemPosition() 也应该被调用。希望它能帮助别人。为了更好的性能,您可以根据您的要求进行更改。
我从这个post得到了需要的突破和理解:@Louth回答
Remove Fragment Page from ViewPager in Android
就把
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) {
}
});