0

我正在构建一个杂志电子阅读器应用程序,使用 viewpager 作为主要导航元素。文章对象被反序列化(来自从 REST Web 服务接收的数据),并用于膨胀由用户“翻阅”的寻呼适配器膨胀的“封面”。

这一切都可以完美地使用 PagerAdapter 和像这样的 instantiateItem 方法(将文章的 ArrayList 传递给适配器的构造函数):

    @Override
    public Object instantiateItem(View arg0, int position) {

    final Article s = toShow.get(position);

    View v = getLayoutInflater().inflate(R.layout.previewpage, null);

    TextView hl = (TextView)v.findViewById(R.id.coverHl);
    ImageView img = (ImageView)v.findViewById(R.id.coverImg);

            ....

    hl.setText(s.title);
    img.setImageBitmap(s.image);

我的问题是,在每第 6 个位置,我想增加一个不同的视图来展示广告。目前,我在此方法的顶部添加了一个 if 语句,例如:

if ((position != 0) && (position%6 == 0)){

之后我放大另一个视图并在其上放置适当的广告。但是,这会导致许多复杂情况:在下一个视图中,我不能再使用 toShow.get(position),因为这样做会跳过数组中的一篇文章(位于广告展示位置的文章)。因此,我创建了一个int adsShown,每次显示广告时都会递增,然后调用final Article s = toShow.get(position - adsShown). 但是当我这样做时,如果用户通过 viewpager 向后翻转,则会显示 ArrayIndexOutOfBounds 错误,因为它的 position-adsshown 为 -1。

我知道我可以找到解决这些问题的方法,但我怀疑是否有更简单的方法来处理这个任务。

有任何想法吗?

4

1 回答 1

1

您可以使用以下方法获得正确的位置:

// check if position > 0 to make sure we don't start with an ad
if(position > 0 && position%6 == 0) {
  // get ad view here
else {
  int index = position - (int)Math.floor(position/6);
  final Article s = toShow.get(index);
  ...
}

还要记住,您getCount必须返回文章数量加上广告数量,否则它不会显示您数组中的所有文章。

于 2013-03-08T04:53:13.630 回答