单个ListView内的多个ViewPagers崩溃

时间:2013-06-18 15:56:36

标签: android android-listview android-fragments android-viewpager

在浏览浏览器时,使用 setId()方法完成 getView() getView()方法 > BaseAdapter

Code of Implementation类似于这个帖子,我在这里找到: On This Post

在创建每个ViewPager的对象后添加了setId(position + 1)。

enter image description here

但是,当我开始滚动列表(水平)应用程序崩溃时,显示Logcat中的错误:

  

06-18 21:06:55.020:E / AndroidRuntime(1928):致命异常:主要   06-18 21:06:55.020:E / AndroidRuntime(1928):   android.content.res.Resources $ NotFoundException:无法找到   资源ID#0x7 06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.content.res.Resources.getResourceName(Resources.java:1653)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)06-18 21:06:55.020:E / AndroidRuntime(1928):atandroid.support.v4.view.ViewPager.populate(ViewPager.java: 1064)06-18   21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.view.ViewPager.populate(ViewPager.java:911)06-18   21:06:55.020:E / AndroidRuntime(1928):at   android.support.v4.view.ViewPager.setAdapter(ViewPager.java:440)06-18   21:06:55.020:E / AndroidRuntime(1928):at   com.example.democardswipelistview.CustomSwipeAdapter.getView(CustomSwipeAdapter.java:72)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.widget.AbsListView.obtainView(AbsListView.java:2012)06-18   21:06:55.020:E / AndroidRuntime(1928):at   android.widget.ListView.makeAndAddView(ListView.java:1772)06-18   21:06:55.020:E / AndroidRuntime(1928):at   android.widget.ListView.fillUp(ListView.java:705)06-18 21:06:55.020:   E / AndroidRuntime(1928):at   android.widget.ListView.fillGap(ListView.java:645)06-18 21:06:55.020:   E / AndroidRuntime(1928):at   android.widget.AbsListView.trackMotionScroll(AbsListView.java:4546)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.widget.AbsListView $ FlingRunnable.run(AbsListView.java:3813)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   android.os.Handler.handleCallback(Handler.java:605)06-18   21:06:55.020:E / AndroidRuntime(1928):at   android.os.Handler.dispatchMessage(Handler.java:92)06-18   21:06:55.020:E / AndroidRuntime(1928):at   android.os.Looper.loop(Looper.java:137)06-18 21:06:55.020:   E / AndroidRuntime(1928):at   android.app.ActivityThread.main(ActivityThread.java:4424)06-18   21:06:55.020:E / AndroidRuntime(1928):at   java.lang.reflect.Method.invokeNative(Native Method)06-18   21:06:55.020:E / AndroidRuntime(1928):at   java.lang.reflect.Method.invoke(Method.java:511)06-18 21:06:55.020:   E / AndroidRuntime(1928):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)   06-18 21:06:55.020:E / AndroidRuntime(1928):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)06-18   21:06:55.020:E / AndroidRuntime(1928):at   dalvik.system.NativeStart.main(原生方法)

1 个答案:

答案 0 :(得分:7)

好的,所以在2天后,我能够解决类似的问题。

首先不要将ViewPager保留在getView()中。我的意思是你不应该致电convertView.setTag(holder);holder = (ViewHolder)convertView.getTag()。只需删除检查convertView是否为null的if语句。然后完全删除else语句块。

要做的另一个更改(这不是原因之一)是您需要优化设置ID的方式。 而不是setId(position+1),在您的values文件夹中创建一个Ids.xml文件,然后在该文件中放置:

<?xml version="1.0" encoding="utf-8"?>

<resources>
  <!-- use to generate non-conflicting ids for the viewpager -->

  <item name="viewpager_id_base" type="id"/>
</resources>

然后在getView()方法中,将setId(position+1)替换为setId(R.id.viewpager_id_base + position)

完成上述更改后,列表不会崩溃,但在您将项目滚动到屏幕后它将消失。以下是对此的修复:

确保自定义PageAdapter扩展FragmentStatePagerAdapter,而不是FragmentPagerAdapter。这将正确销毁视图并触发onCreateView()。