Здесь есть аналогичный вопрос: активность с использованием ViewPager, PagerAdapter и AsyncTask вызывает пустой просмотр, но моя проблема больше.
У меня есть ViewPager, который содержит ListView. Этот ListView заполняется asyncTask. Listview отображает данные, но не правильно. Первая страница всегда пустая, а вторая страница содержит данные BOTH.
Я упростил свою асинтеску, чтобы быть уверенным, что это не то, что вызывало проблему.
@Override
public Object instantiateItem(View pager, int position){
// Log.d("PAGER", Integer.toString(position));
ctx = pager.getContext();
v = new ListView(ctx);
new CreateArrayListTask().execute(URLS[position]);
((ViewPager)pager).addView(v, 0);
return v;
}
CreateArrayListTask
private class CreateArrayListTask extends AsyncTask<String, Void, ArrayList<String>> {
@Override
protected ArrayList<String> doInBackground(String... params) {
linkArray.add("Item 1");
linkArray.add("Item 2");
return linkArray;
}
onPostExecute
protected void onPostExecute(ArrayList<String> linkArray) {
ArrayAdapter<String> a = new ArrayAdapter<String>(ctx, android.R.layout.simple_list_item_1, linkArray);
v.setAdapter(a);
ListView
на второй странице дважды заполняется именно из-за моего ответа, указанного в другом вопросе.
Вы предполагаете, что instantiateItem
будет вызываться только для текущей активной страницы, тогда как на самом деле он будет вызван и для предварительной загрузки для внестраничных страниц. Ссылка v
на представление будет перезаписана вторым вызовом instantiateItem
.
Взгляните на этот примерный проект, чтобы увидеть один из способов, как это сделать с фрагментами: https://github.com/antonyt/ListFragmentViewPagerExample/tree/master/src/com/example/listfragment
Мероприятия:
public class ListFragmentViewPagerActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager()));
}
public class ExamplePagerAdapter extends FragmentPagerAdapter {
public ExamplePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 5;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new ExampleListFragment();
// set arguments here, if required
Bundle args = new Bundle();
// args.put(...)
fragment.setArguments(args);
return fragment;
}
}
}
Фрагмент:
public class ExampleListFragment extends ListFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// normally you should inflate a view here and save references
// using ListFragment default layout for this example
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onStart() {
super.onStart();
new CreateArrayListTask().execute();
}
private class CreateArrayListTask extends AsyncTask<String, Void, ArrayList<String>> {
@Override
protected ArrayList<String> doInBackground(String... params) {
ArrayList<String> linkArray = new ArrayList<String>();
linkArray.add("Item 1");
linkArray.add("Item 2");
return linkArray;
}
protected void onPostExecute(ArrayList<String> linkArray) {
ArrayAdapter<String> a = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, linkArray);
setListAdapter(a);
}
}
}