use custom layout instead of delegate