罗曼·努里克的向导页面 - 如何访问收集的数据?

7

我正在尝试使用Roman Nurik的库制作向导(https://plus.google.com/113735310430199015092/posts/6cVymZvn3f4)。

我在访问收集的Review Fragment数据方面遇到了问题。我将ReviewFragment中的mCurrentReviewItems设置为public,然后我像这样尝试使用:

mNextButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
            ReviewFragment reviewFragment = (ReviewFragment)  mPagerAdapter.getItem(mPager.getCurrentItem());

            for (ReviewItem item : reviewFragment.mCurrentReviewItems)
                Log.d(MainActivity.TAG, "Item: " + item.getDisplayValue());
            }

        } else {
            if (mEditingAfterReview) {
                mPager.setCurrentItem(mPagerAdapter.getCount() - 1);
            } else {
                    mPager.setCurrentItem(mPager.getCurrentItem() + 1);
            }
        }
   }
});

然而它总是为空。

5个回答

11

if (mPager.getCurrentItem() == mCurrentPageSequence.size()) { } 语句中:

对于单页面变量:

String data = mWizardModel.findByKey("Sandwich:Bread").getData().getString(Page.SIMPLE_DATA_KEY);

对于定制页面:

String data = 
mWizardModel.findByKey(THE_KEY).getData().getString(CustomerInfoPage.YOUR_DATA_KEY);

如果您想将数据分配回向导,请在FragmentActivity的onCreate结尾处添加以下内容:
Bundle data = new Bundle();
if (!TextUtils.isEmpty(DATA_STRING)) {
    data.putString(Page.SIMPLE_DATA_KEY, DATA_STRING);
    mWizardModel.findByKey("Sandwich:Bread"").resetData(data);
}

“Sandwich:Bread”这个关键字只是一个示例,你可以根据需要更改。不要尝试多个关键字,我认为它们大同小异。


1
当您在多个页面上使用相同的标题时会发生什么? - Olayinka
@Olayinka:PageList类只是在ArrayList中遍历所有页面,直到找到匹配的键为止。因此,如果你恰好设置了相同的标题(即具有相同的键),在迭代过程中只会得到第一个出现的页面。这可能不符合你的期望。 - FuzzyAmi

3
抱歉耽搁了这么久,但我认为有人会发现这些信息很有用。我找到了一种方法来获取所有的ReviewItems,因为你可以有很多分支,并且你将无法使用第一个答案。
我非常确定,你的mPagerAdapter::getItem代码看起来像例子(所以它只返回新片段,而不是返回当前分页器片段)。你必须使用instantiateItem来获取ReviewFragment的引用。
Object o = mPager.getAdapter().instantiateItem(mPager, mPager.getCurrentItem());
if(o instanceof ReviewFragment) {
  List<ReviewItem> items = ((ReviewFragment) o).getCurrentReviewItems();
  if(items != null) {
    Log.v(TAG, "Items are: " + items.toString());
  }
}

请帮忙,我遇到了一个错误:“无法解析方法getCurrentReviewItems()”,出错代码为:List<ReviewItem> items = ((ReviewFragment) o).getCurrentReviewItems(); - bmacharia

0
最佳解决方案是将此库作为模块包含在您的项目中,并实现自己的方法来获取ReviewFragment中的评论项。
public List<ReviewItem> getReviewItems() {
    return mCurrentReviewItems;
}

我不确定开发者为什么没有添加那个。这是项目中最重要的事情。选择项目并对它们进行操作。


0

如果还有人在寻找解决此问题的方法,您可以使用以下代码

    ArrayList<ReviewItem> reviewItems = new ArrayList<ReviewItem>();
    for (Page page : mWizardModel.getCurrentPageSequence()) {
        page.getReviewItems(reviewItems);
    }

0

这是我的代码 @Anton_Shkurenko

mNextButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
                Object o = mPager.getAdapter().instantiateItem(mPager, mPager.getCurrentItem());
                if(o instanceof ReviewFragment) {
                    List<ReviewItem> items = ((ReviewFragment) o).getCurrentReviewItems();
                    if(items != null) {
                        Log.v(TAG, "Items are: " + items.toString());
                    }
                }
            }
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接