ViewPager, ListView и AsyncTask, первая страница пуста, все данные на второй странице - PullRequest
1 голос
/ 15 марта 2012

Здесь есть похожий вопрос, Активность с использованием ViewPager, PagerAdapter и AsyncTask вызывает пустое представление , но моя проблема не только в этом.,Этот ListView заполняется asyncTask.В списке отображаются данные, но не правильно.Первая страница всегда пуста, а вторая страница содержит ОБА страницы.

Я упростила свою асинхронную задачу, чтобы убедиться, что в ней нет ничего вызывающего.

@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);

enter image description here

1 Ответ

1 голос
/ 15 марта 2012

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);
    }
    }

}
...