ViewPager, ListView и AsyncTask, первая страница пуста, все данные на второй странице

1

Здесь есть аналогичный вопрос: активность с использованием 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);

Изображение 174551

Теги:
android-viewpager
android-asynctask

1 ответ

1
Лучший ответ

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

}
  • 0
    в другом ответе вы предлагаете использовать фрагменты, я раньше не использовал фрагменты, поэтому я не слишком знаком с тем, как они работают. Вы бы хотели / могли бы привести пример использования фрагментов в случае, подобном этому?
  • 0
    @ r2DoesInc Я добавил пример проекта в свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню