我在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();
}
});
}
答案 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()的未来。