Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t使FragmentPagerAdapter更新片段内容_Android_Android Viewpager_Fragmentpageradapter - Fatal编程技术网

Android Can';t使FragmentPagerAdapter更新片段内容

Android Can';t使FragmentPagerAdapter更新片段内容,android,android-viewpager,fragmentpageradapter,Android,Android Viewpager,Fragmentpageradapter,我试图更新传递给适配器的数据,从而更新内容依赖于这些数据的片段 这是地址: import android.app.Fragment; import android.app.FragmentManager; import android.os.Bundle; import android.support.v13.app.FragmentPagerAdapter; public class ScheduleFragment_Pager_adapter extends FragmentPagerAda

我试图更新传递给适配器的数据,从而更新内容依赖于这些数据的片段

这是地址:

import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentPagerAdapter;
public class ScheduleFragment_Pager_adapter extends FragmentPagerAdapter {

        private String CurrentSelectedYearID="",CurrentSelectedTermID="";

        public ScheduleFragment_Pager_adapter(FragmentManager fm , String SelectedYearID , String SelectedTermID) {
            super(fm);
            CurrentSelectedYearID = SelectedYearID;
            CurrentSelectedTermID = SelectedTermID;
        }

        @Override
        public Fragment getItem(int position) {

            Bundle bundle = new Bundle();
            bundle.putString("CurrentSelectedYearID", CurrentSelectedYearID);
            bundle.putString("CurrentSelectedTermID",CurrentSelectedTermID);

            if(position==0)
            {
                ClassesFragment classesFragment = new ClassesFragment();
                classesFragment.setArguments(bundle);
                return classesFragment;
            }
            else if(position==1)
            {
                ExamsFragment examsFragment = new ExamsFragment();
                examsFragment.setArguments(bundle);
                return examsFragment;
            }

            return null;
        }

        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "Classes";
                case 1:
                    return "Exams";
            }
            return null;
        }
    }
我尝试过使用这个,但它不起作用,或者我无法理解它

下面是我如何使用适配器以及如何尝试更新它

在主片段的
onCreateView
[我正在处理嵌套片段]

  mViewPager.setAdapter(new ScheduleFragment_Pager_adapter(getChildFragmentManager(), mSelectedYearID, mSelectedTermID));
我像这样更新适配器

@Override    
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 0){
            if(resultCode == Activity.RESULT_OK){
                mSelectedTermID = data.getStringExtra("mSelectedTermID");
                mSelectedYearID = data.getStringExtra("mSelectedYearID");
                mViewPager.getAdapter().notifyDataSetChanged();
            }
        }
    }
其中,
onActivityResult
是更新
mSelectedTermID
mSelectedYearID
的地方


有什么帮助吗?

尝试使用FragmentStatePagerAdapter


FragmentPagerAdapter存储用户访问的每个页面的所有片段

通过返回位置\u NONE,每个调用notifyDataSetChanged()适配器都应该删除缓存的片段并重新创建一个新的片段

是否检查是否调用了notifyDataSetChanged()

请注意,通过返回POSITION_NONE,您将失去缓存机制,对于大视图、多页,这可能是一个问题


您可以实现观察者模式-注册创建的片段,并在需要更新时调用它们。

在片段中设置适配器类变量

private ScheduleFragment_Pager_adapter adapter;
主片段的onCreateView

adapter = new ScheduleFragment_Pager_adapter(getChildFragmentManager(), mSelectedYearID, mSelectedTermID)
 mViewPager.setAdapter(adapter);
在适配器中

public void setValues( String SelectedYearID , String SelectedTermID) {
        CurrentSelectedYearID = SelectedYearID;
        CurrentSelectedTermID = SelectedTermID;
    }
onActivityResult

  adapter.setValues(mSelectedTermID, mSelectedYearID);
  adapter.notifyDataSetChanged();

我试过了,但是没有什么不同,仍然没有更新这些适配器用于不同的目的。选择取决于页面数量和视图大小。如何将mSelectedTermID和mSelectedYearID传递给适配器?我看到您将它们传递给构造函数,但稍后要更新适配器如何传递它们?@temna_nich、
mSelectedTermID
mSelectedYearID
都是全局变量,在我调用
setAdapter
之前,在
onCreateView
中为它们赋值,这使适配器工作正常,然后这些值可以在ActivityResult上更改,我没有再次传递它们--我应该再次传递吗,,,这就是你想要的吗?添加日志消息或断点并检查
mviewpage.getAdapter().notifyDataSetChanged()。确实应该尝试。当您将它们传递给构造函数时,这就是它们进入适配器的方式。但我不知道更新后如何传递它们。尝试使用setter方法。为此,您需要将适配器作为变量存储在片段中,并更新其中的值。@temna_nich,如何将它们再次传递给构造函数,我使用的是
mViewPager.getAdapter()
,当然,您可以这样写,这正是我使用您再次传递数据的建议所做的。非常感谢您,我使用了
FragmentStatePagerAdapter
而不是
FragmentPagerAdapter
,并通过始终返回
POSITION\u NONE
来覆盖
getItemPosition
,并将数据再次传递给adapater,这很有效,但是是否有其他有效的方法来覆盖我的
getItemPosition
是,我明白你的意思了,但是你能在
getItemPosition
的代码方面给我一点帮助吗。在设置/更新适配器时,我做了以下操作:
Object[]Frags={newclassesfragment(),newexamfragment()}
并将其传递给Adapter为什么要覆盖getItemPosition?我检查了我的适配器,我从来没有覆盖过这个方法,你能尝试删除它吗?
FragmentStatePagerAdapter
对我来说很好,然而,我已经将
getItemPosition
实现为始终
POSITION\u NONE
,但是有没有其他有效的方法来实现它呢?Observer模式与FragmentStatePagerAdapter,但其思想是相同的。这对我来说是多么先进