如何迭代使用RecyclerView并使用方法`getItemViewType()`来扩充不同的行?

时间:2016-05-03 17:17:51

标签: android

我有一个列表,其中我显示了一些状态,现在我想在列表中的每个5个元素之后显示一些不同的视图,但我无法实现这一点。可能我应该使用循环,但我已经尝试并犯了一些错误。现在我只为列表中间的元素获得了视图类型,但这不是我想要的。我想在每5个元素之后显示该视图。这就是我的代码的样子:

@Override
public int getItemViewType(int position) {
    if (jokes.get(position) != null) {
        if (position % 5 == 0 && position != 0) {
            return VIEW_TYPE_BANNER;
        }
        return VIEW_TYPE_ITEM;
    } else {
        return VIEW_TYPE_LOADING;
    }
}

@Override
public int getItemCount() {
    return jokes == null ? 0 : jokes.size();
}

1 个答案:

答案 0 :(得分:2)

<强>更新

更改

module ExistsExample where

import Data.Exists
import Data.List
import Control.Monad.Eff.Console
import Control.Monad.Eff
import Prelude
import Data.Traversable

main :: forall e. Eff (console :: CONSOLE | e) Unit
main = do
    let all = updateAll $ updateAll drawables
    drawAll all

type DrawEffect = forall e. Eff (console :: CONSOLE | e) Unit

data DrawOps a = DrawOps { "data" :: a
                         , draw :: a -> DrawEffect
                         , update :: a -> a
                         }

updateInt = (+1)
updateString = (++ ".")

drawables :: List (Exists DrawOps)
drawables = fromFoldable $ [ mkExists (DrawOps { "data": 1
                                          , draw: print
                                          , update: updateInt
                                          })
                           , mkExists (DrawOps { "data": "foo"
                                          , draw: print
                                          , update: updateString
                                          })
                           ]

drawAll :: List (Exists DrawOps) -> DrawEffect
drawAll list = do
    traverse (runExists drawOne) list
    return unit
  where
    drawOne :: forall a. (DrawOps a) -> DrawEffect
    drawOne (DrawOps ops) = ops.draw ops."data"


updateAll :: List (Exists DrawOps) -> List (Exists DrawOps)
updateAll =
    map (runExists updateOne)
  where
    updateOne :: forall a. DrawOps a -> Exists DrawOps
    updateOne (DrawOps ops) = mkExists (DrawOps ( { draw: ops.draw
                                        , update: ops.update
                                        , "data": ops.update ops."data" } ))

return jokes == null ? 0 : jokes.size();

反映您因横幅而有更多观看次数,或

return jokes == null ? 0 : jokes.size() + jokes.size() / 5;

如果你不在最后放一个横幅让我们说15个笑话。

替代解决方案

创建return jokes == null ? 0 : jokes.size() + (jokes.size() - 1) / 5; 的{​​{1}}备用array以与适配器配合使用。

在您想要笑话的地方添加List<Object>,在您想要横幅的地方添加class Joke

然后在class Banner中检查getItemViewType(int position)并相应地返回一个值。

这样就不需要数学了。