ViewPager,ListView和AsyncTask,第一页空白,第二页中的所有数据

时间:2012-03-15 05:51:16

标签: java android android-asynctask android-viewpager

这里有一个类似的问题Activity using ViewPager, PagerAdapter and AsyncTask causes a blank view,但我的问题不止于此。

我有一个包含ListView的ViewPager。此ListView由asyncTask填充。列表视图显示数据,但不正确。第一页始终为空白,第二页包含两页数据。

我已经简化了我的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 个答案:

答案 0 :(得分:1)

由于另一个问题中给出了my answer,第二页上的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);
    }
    }

}