我有一个列表,其中我显示了一些状态,现在我想在列表中的每个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();
}
答案 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)
并相应地返回一个值。
这样就不需要数学了。