【发布时间】:2021-09-16 16:27:51
【问题描述】:
我认为我已经正确设置了视图模型,但是我在设置观察者时遇到了问题任何帮助将不胜感激
视图模型
class GP1ViewModel() : ViewModel() {
val gameCardsLiveData: MutableLiveData<List<GameCard>> = MutableLiveData()
var gameCards: MutableList<GameCard> = ArrayList()
private var indexOfSelectedPiece: Int? = null
val images = mutableListOf(
R.drawable.memorybatcardfront,
R.drawable.memorycatcardfront,
R.drawable.memorycowcardfront,
R.drawable.memorydragonfront,
R.drawable.memorygarbagemancardfront,
R.drawable.memoryghostdogcardfront
)
init {
for (image in images) {
gameCards.add(GameCard(image, imageID = image))
}
gameCardsLiveData.value = gameCards
images.addAll(images)
images.shuffle()
Log.d(TAG, "ViewModel Created:")
}
fun updatingModels(position: Int) {
val gameCard = gameCards[position]
if (gameCard.isFacedUp) return
if (indexOfSelectedPiece == null) {
restoreGameCards()
indexOfSelectedPiece = position
}
else {
checkingForMatch(indexOfSelectedPiece!!, position)
indexOfSelectedPiece = null
}
gameCard.isFacedUp = !gameCard.isFacedUp
}
private fun restoreGameCards() {
for (gameCard in gameCards) {
if (!gameCard.isMatched) {
gameCard.isFacedUp = false
}
}
}
private fun checkingForMatch(position1: Int, position2: Int) {
if (gameCards[position1].id == gameCards[position2].id) {
gameCards[position1].isMatched = true
gameCards[position2].isMatched = true
}
else {
Handler(Looper.getMainLooper()).postDelayed({
gameCards[position1].isFacedUp = false
gameCards[position2].isFacedUp = false
}, 1000)
Log.d(TAG, "checkingForMatch: the lag is called")
}
}
}
片段
class GamePlay1Fragment : Fragment() {
// lateinit var front_anim: AnimatorSet
// lateinit var back_anim: AnimatorSet
private lateinit var viewModel: GP1ViewModel
private lateinit var pieces: List<ImageView>
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: Gameplay1FragmentBinding = DataBindingUtil.inflate(
inflater,
R.layout.gameplay1_fragment,
container, false)
viewModel = ViewModelProvider(this).get(GP1ViewModel::class.java)
binding.viewModel = viewModel
binding.lifecycleOwner = viewLifecycleOwner
binding.backButtonView.setOnClickListener { v: View ->
v.findNavController().navigate(GamePlay1FragmentDirections.actionGamePlay1FragmentToLobbyFragment())
}
viewModel.gameCardsLiveData.observe(viewLifecycleOwner, Observer {
pieces = listOf(binding.card1back, binding.card2back, binding.card3back, binding.card4back,
binding.card5back,binding.card6back, binding.card7back,
binding.card8back, binding.card9back, binding.card10back, binding.card11back,
binding.card12back)
if (viewModel.gameCards.isEmpty()) {
viewModel.gameCards = pieces.indices.map { index ->
GameCard(viewModel.images[index], false, false, viewModel.images[index]).also {
GameCard(id, false, false, viewModel.images[index]).isFacedUp = true
}
}.toMutableList()
}
pieces.forEachIndexed { index, piece ->
piece.setOnClickListener {
viewModel.updatingModels(index)
}
}
})
return binding.root
}
只是不确定如何设置观察者。观察者应该能够控制方向的变化,并能够在一秒钟后将卡片翻转过来。谢谢大家。
【问题讨论】:
标签: android android-studio android-layout android-fragments android-viewmodel