我正在尝试使用对象列表预先填充FragmentStatePagerAdapter,但我无法实例化新片段。
背景
My PagerAdapter由Msg对象的ArrayList( mMsgConvoList)组成。 MsgConvoList是来自给定线程的所有消息的ArrayList。
mMsgConvoList的分区会创建每个3个消息的子列表( msgSublist )。
每个子列表都经过while循环,由PagerAdapter在创建新片段和添加其他文本视图时处理:
while循环中的逻辑如何工作:
如果count == 2,则表示应该有一个新片段,否则如果count为1到0,则找到currentFragment并添加Msg(这是发生错误的位置)。
错误:
在count == 2之后发生错误。在while循环的'else'部分,currentFragment为NULL(count = 1或0)。似乎永远不会调用MsgFragment上的instantiateItem。我不确定为什么在使用下面的循环时这不起作用。
Caused by: java.lang.NullPointerException
at to.testing.viewpagertest.MsgPagerActivity.onCreate(MsgPagerActivity.java:55)
如果我从while循环中删除'else'条件中的所有代码,则会创建片段并将对象添加到文本视图中:
if (count == 2){
mAdapter.addMessages(msgSublist.get(count));
mAdapter.notifyDataSetChanged();
mViewPager.setCurrentItem(mAdapter.getCount(), true);
这告诉我一些事情:上面的代码,在while循环之外工作,因此数据集在textView中正常工作,并且片段正在成功创建。只有当我尝试向现有Array添加一个额外的Msg对象时,才能创建currentFragment。任何建议都会非常感激。
MsgPagerActivity:
if(mMsgConvoList.size() > 0) {
List msgPartitions = daoMsg.partitionArray(mMsgConvoList, 3);
mAdapter = new CustomPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mAdapter);
for(int i = msgPartitions.size() - 1; i >= 0; i--){
//extract msg objects from each sublist
List<Msg> msgSublist = (List<Msg>)msgPartitions.get(i);
int count = msgSublist.size() -1;
while(count >= 0){
if (count == 2){
mAdapter.addMessages(msgSublist.get(count));
mAdapter.notifyDataSetChanged();
mViewPager.setCurrentItem(mAdapter.getCount(), true);
}else{
mViewPager.setCurrentItem(mAdapter.getCount(), true);
MsgFragment currentFragment = (MsgFragment)mAdapter.getFragmentAtPosition(
mAdapter.getCount() - 1);
currentFragment.addMessage(msgSublist.get(count));
}
count--;
}