java - ViewPager、ListView和AsyncTask,第一页空白,第二页所有数据

标签 java android android-asynctask android-viewpager

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

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

我已经简化了我的异步任务,以确保 tit 不是导致问题的原因。

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

创建数组列表任务

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

最佳答案

第二页的 ListView 被双重填充正是因为 my answer在另一个问题中给出。

您假设 instantiateItem 只会为当前 Activity 页面调用,而实际上它也会被调用以预加载屏幕外页面。对 View 的引用 v 将被第二次调用 instantiateItem 覆盖。

查看此示例项目以了解如何使用 fragment 执行此操作的一种方法:https://github.com/antonyt/ListFragmentViewPagerExample/tree/master/src/com/example/listfragment

Activity :

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

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

}

关于java - ViewPager、ListView和AsyncTask,第一页空白,第二页所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9714633/

相关文章:

Java 在同一循环中添加/删除,没有 ConcurrentModificationException

java - Gradle 在应用程序 :transformDexWithInstantRunSlicesApkForDebug 中崩溃

java - 设立新的服务领导者并通知领导者

Java gson 错误 : Expected BEGIN_OBJECT but was BEGIN_ARRAY (but my type map is correct? )

android - 在 Google Cardboard 中播放视频

java - android.os.FileUriExposedException 在 Oreo 中引起(仅!)

java - 为什么一个执行两次而不是两个不同的 AsyncTasks?

java - Android Bump Api Network 主线程异常

java - Android 的每个环境配置

java - 如果我有一个扩展 <AsyncTask> 类的单独类,如何从 onPostExecute() 获取值?