如何从ViewPager中的下一个Fragment中选择Fragment ArrayList中的值?

时间:2017-04-23 22:18:42

标签: android android-viewpager

我在ViewPager中一次创建两个Fragment实例(默认情况下,一个在当前查看的页面之前,一个在:Fragment f1,Fragment f2之后)。在Fragment instacnes中我有ArrayList从解析的html中添加值。当我滑动到选定的片段(n)并想要从ArrayList获取所选片段的值时,ViewPager覆盖该ArrayList和引用指向最后一页创建片段f2(n + 1)的ArrayList并从那里获取值。 / p>

这是PagerAdapter类:

public class PagerAdapter extends FragmentStatePagerAdapter  {

private List<Fragment> fragments;
/**
 * @param fm
 * @param fragments
 */
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
    super(fm);
    this.fragments = fragments;
}
/* (non-Javadoc)
 * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
 */
@Override
public Fragment getItem(int position)
{
    return this.fragments.get(position);
}

/* (non-Javadoc)
 * @see android.support.v4.view.PagerAdapter#getCount()
 */
@Override
public int getCount() {
    return this.fragments.size();
}

这是我的类,我将片段实例添加到ViewPager:

private PagerAdapter mPagerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_pager_adapter_info);

    initialisePaging();
}
private void initialisePaging() {

    Fragment f1 = new FragmentNewsReader(); // Fragment instances
    Bundle args1 = new Bundle() ;
    args1.putString("name", FragmentMainPage.ahref.get(5));
    args1.putString("title", "Info");

    f1.setArguments(args1);

    Fragment f2 = new FragmentNewsReader();
    Bundle args2 = new Bundle() ;
    args2.putString("name", FragmentMainPage.ahref.get(6));
    args2.putString("title", "Info");
    f2.setArguments(args2);

    List<Fragment> fragments = new Vector<Fragment>();

    fragments.add(f1);
    fragments.add(f2);
            this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager(), fragments);

    ViewPager pager = (ViewPager)findViewById(R.id.view_pager_info);

    pager.setAdapter(this.mPagerAdapter);
    pager.setOffscreenPageLimit(0);

    pager.setCurrentItem(FragmentMainPage.broj);

}

这是Fragment类:

 ArrayList<String> slicnitekstoviniz=new ArrayList<String>()// arraylist 
 // where i put data from parsed html

 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

    super.onViewCreated(view, savedInstanceState);       

    Ion.with(getActivity().getApplicationContext()) // Parsing data from web
            .load(result)
            .asString()
            .setCallback(new FutureCallback<String>()  {
                @Override
                public void onCompleted(Exception e, String result) {

                    String htmlString=result;

                    int spSLicni  = result.indexOf("<ul class=\"article-array\">");

                    int epSLicni  = result.indexOf("<!-- END .article-array -->");

                    String slicniTekstovi = result.substring(spSLicni, epSLicni);/

                    while (slicniTekstovi.indexOf("class=\"comment-icon\">") > 0) {/
                        int spHSLicni  = slicniTekstovi.indexOf("<a href=");
                        int epHSLicni  = slicniTekstovi.indexOf("/\">");

                        String ahfrefSlicni = slicniTekstovi.substring(spHSLicni, epHSLicni);

                        ahrefSlicniniz.add(ahfrefSlicni);                              

// Here is problem when i want to use data from ahrefSlicniniz.get(0) 
// I get values from next fragment and not from selected fragment

                    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
                    SharedPreferences.Editor editor = prefs.edit();

                    editor.putString("string_id", ahrefSlicniniz.get(0));
                    editor.commit();
                }
            });
}

1 个答案:

答案 0 :(得分:1)

当您从ViewPager中选择一个页面时,viewPager&#34;准备&#34;它之前和之后的页面,当你侧身移动时提供平滑的分页。对代码的影响是它在您正在使用的两个片段上调用onViewCrated()。当您使用相同的密钥在共享首选项中存储String时,您将遇到竞争条件,其中最后一次运行的回调是获取字符串的回调。

快速解决方法是在密钥中添加一个片段编号(&#34; string_id_1&#34; /&#34; string_id_2&#34;)并适当地选取该值。

编辑1

你有:

Fragment f1 = new FragmentNewsReader(); // Fragment instances
    Bundle args1 = new Bundle() ;
    args1.putString("name", FragmentMainPage.ahref.get(5));
    args1.putString("title", "Info");

添加

 args1.putString("my_string_id","1");

f1.setArguments(args1);

然后在你的片段的onCreate()中,你读取了值并将其存储在本地。

private String myId;

...

public void onCreate(...){
    ...
    Bundle args = getArguments();
        if (args != null) {
            myId = args.getString("my_string_id");
        }
    ...
 }

为片段2更改&#34; my_string_id&#34;并执行相同的操作。值为2而不是1;

最后,在存储和获取共享首选项的位置,将myId实例变量附加到键名称。

我还看到了你应该考虑的其他一些事情。

1)如果您希望每次访问页面时都运行回调,则应将其移至onResume(),或者更好地移至onUserVisibilityHint(),但最后一个选项需要更多种族争用处理。

2)如果您使用FragmentManager或SupportFragmentManager直接控制片段,则在您需要时将片段实例存储在数组中以便从主活动中获取它们。但是,如果片段由ViewPager管理,那么它的工作非常糟糕。 ViewPager会在它认为合适的情况下在场景后面创建片段的新实例,但它不会更新你的arraylist,留下旧的,不再使用任何实例)。

3)如果你只有2个片段可能不是问题,但是如果你有超过3个片段,当片段不再存在于内存中时,可以执行Ion回调。也许你可以取消片段中onPause()的未来。