Création des class pour une liste de cartes : Adapter, Fragment et ViewModel

This commit is contained in:
biloute02 2023-12-23 22:28:56 +01:00
parent 1c04f18ec8
commit 0775eb13da
20 changed files with 92 additions and 138 deletions

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />

View file

@ -1,14 +1,11 @@
package com.example.palto package com.example.palto
import android.app.Activity
import android.nfc.NfcAdapter import android.nfc.NfcAdapter
import android.nfc.Tag import android.nfc.Tag
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import java.net.URL
class PaltoActivity : AppCompatActivity() { class PaltoActivity : AppCompatActivity() {
private var nfcAdapter: NfcAdapter? = null private var nfcAdapter: NfcAdapter? = null

View file

@ -1,9 +1,5 @@
package com.example.palto.data.local package com.example.palto.data.local
import com.example.palto.data.Result
import com.example.palto.data.model.LoggedInUser
import java.io.IOException
/** /**
* Class that handles authentication w/ login credentials and retrieves user information. * Class that handles authentication w/ login credentials and retrieves user information.
*/ */

View file

@ -1,9 +1,10 @@
package com.example.palto.data.network package com.example.palto.data.network
import com.example.palto.data.Result import com.example.palto.data.Result
import com.example.palto.data.model.LoggedInUser import com.example.palto.model.LoggedInUser
import com.example.palto.data.model.Tokens import com.example.palto.model.Tokens
import java.io.IOException import java.io.IOException
import java.util.UUID
/** /**
* Class that handles API calls. * Class that handles API calls.
@ -43,7 +44,7 @@ class ServerDataSource {
): Result<LoggedInUser> { ): Result<LoggedInUser> {
try { try {
val fakeUser = LoggedInUser( val fakeUser = LoggedInUser(
java.util.UUID.randomUUID().toString(), UUID.randomUUID().toString(),
"dede", "dede",
"Lucie", "Lucie",
"Doe", "Doe",

View file

@ -1,9 +1,6 @@
package com.example.palto.data.repository package com.example.palto.data.repository
import com.example.palto.data.Result
import com.example.palto.data.network.ServerDataSource import com.example.palto.data.network.ServerDataSource
import com.example.palto.data.model.LoggedInUser
import com.example.palto.data.model.Tokens
/** /**
* *

View file

@ -2,8 +2,7 @@ package com.example.palto.data.repository
import com.example.palto.data.Result import com.example.palto.data.Result
import com.example.palto.data.network.ServerDataSource import com.example.palto.data.network.ServerDataSource
import com.example.palto.data.model.LoggedInUser import com.example.palto.model.LoggedInUser
import com.example.palto.data.model.Tokens
/** /**
* Class that requests authentication and user information from the remote data source and * Class that requests authentication and user information from the remote data source and

View file

@ -0,0 +1,10 @@
package com.example.palto.data.repository
import com.example.palto.data.network.ServerDataSource
/**
*
*/
class SessionRepository(val dataSource: ServerDataSource) {
// private val cards
}

View file

@ -1,9 +1,7 @@
package com.example.palto.data.repository package com.example.palto.data.repository
import com.example.palto.data.Result
import com.example.palto.data.network.ServerDataSource import com.example.palto.data.network.ServerDataSource
import com.example.palto.data.model.LoggedInUser import com.example.palto.model.Tokens
import com.example.palto.data.model.Tokens
/** /**
* Class that requests authentication and user information from the remote data source and * Class that requests authentication and user information from the remote data source and

View file

@ -1,4 +1,4 @@
package com.example.palto.data.model package com.example.palto.model
import java.io.Serializable import java.io.Serializable
/** /**

View file

@ -0,0 +1,6 @@
package com.example.palto.model
import java.io.Serializable
data class Card(
val id: String
) : Serializable

View file

@ -1,4 +1,4 @@
package com.example.palto.data.model package com.example.palto.model
import java.io.Serializable import java.io.Serializable

View file

@ -1,9 +1,9 @@
package com.example.palto.data.model package com.example.palto.model
import java.io.Serializable import java.io.Serializable
/** /**
* Data class that captures tokens for logged in users retrieved from LoginRepository * Data class that captures tokens for logged in users retrieved from LoginRepository
*/ */
data class StudentCard( data class Session(
val id: String val id: String
) : Serializable ) : Serializable

View file

@ -1,4 +1,4 @@
package com.example.palto.data.model package com.example.palto.model
import java.io.Serializable import java.io.Serializable
/** /**

View file

@ -4,19 +4,22 @@ import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import com.example.palto.model.Card
import com.example.palto.ui.attendanceList.placeholder.PlaceholderContent.PlaceholderItem
import com.example.palto.databinding.FragmentAttendanceItemBinding import com.example.palto.databinding.FragmentAttendanceItemBinding
/** /**
* [RecyclerView.Adapter] that can display a [PlaceholderItem]. *
* TODO: Replace the implementation with code for your data type.
*/ */
class AttendanceListAdapter( class AttendanceListAdapter :
private val values: List<PlaceholderItem> ListAdapter<Card, AttendanceListAdapter.ViewHolder>(CardDiffCallback) {
) : RecyclerView.Adapter<AttendanceListAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
return ViewHolder( return ViewHolder(
FragmentAttendanceItemBinding.inflate( FragmentAttendanceItemBinding.inflate(
@ -28,20 +31,28 @@ class AttendanceListAdapter(
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = values[position] val item = getItem(position)
holder.idView.text = item.id holder.cardId.text = item.id
holder.contentView.text = item.content //holder.contentView.text = item.content
} }
override fun getItemCount(): Int = values.size inner class ViewHolder(
binding: FragmentAttendanceItemBinding
inner class ViewHolder(binding: FragmentAttendanceItemBinding) : ) : RecyclerView.ViewHolder(binding.root) {
RecyclerView.ViewHolder(binding.root) {
val idView: TextView = binding.itemNumber
val contentView: TextView = binding.content
val cardId: TextView = binding.cardId
override fun toString(): String { override fun toString(): String {
return super.toString() + " '" + contentView.text + "'" return super.toString() + " '" + cardId.text + "'"
} }
} }
}
object CardDiffCallback : DiffUtil.ItemCallback<Card>() {
override fun areItemsTheSame(oldItem: Card, newItem: Card): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: Card, newItem: Card): Boolean {
return oldItem.id == newItem.id
}
} }

View file

@ -9,7 +9,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.navigation.navGraphViewModels import androidx.navigation.navGraphViewModels
import com.example.palto.R import com.example.palto.R
import com.example.palto.ui.attendanceList.placeholder.PlaceholderContent import com.example.palto.databinding.FragmentAttendanceListBinding
/** /**
* A fragment representing a list of attendances. * A fragment representing a list of attendances.
@ -20,14 +20,19 @@ class AttendanceListFragment : Fragment() {
navGraphViewModels(R.id.nav_graph) navGraphViewModels(R.id.nav_graph)
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
val view = inflater.inflate(R.layout.fragment_attendance_list, container, false) val binding = FragmentAttendanceListBinding.inflate(inflater, container, false)
if (view is RecyclerView) {
view.layoutManager = LinearLayoutManager(context) val adapter = AttendanceListAdapter()
view.adapter = AttendanceListAdapter(PlaceholderContent.ITEMS) binding.list.adapter = adapter
attendanceListViewModel.cardsLiveData.observe(viewLifecycleOwner) {
it -> adapter.submitList(it)
} }
return view
return binding.root
} }
} }

View file

@ -1,34 +1,38 @@
package com.example.palto.ui.attendanceList package com.example.palto.ui.attendanceList
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.palto.data.network.ServerDataSource import com.example.palto.data.network.ServerDataSource
import com.example.palto.data.repository.AttendanceRepository import com.example.palto.data.repository.AttendanceRepository
import com.example.palto.data.repository.LoginRepository import com.example.palto.model.Card
import kotlin.random.Random
class AttendanceListViewModel( class AttendanceListViewModel(
private val attendanceRepository: AttendanceRepository private val attendanceRepository: AttendanceRepository
) : ViewModel() { ) : ViewModel() {
/*
private val _loginForm = MutableLiveData<LoginFormState>()
val loginFormState: LiveData<LoginFormState> = _loginForm
private val _loginResult = MutableLiveData<LoginResult>() private val cardsList: MutableList<Card> = mutableListOf()
val loginResult: LiveData<LoginResult> = _loginResult val cardsLiveData: LiveData<List<Card>> = MutableLiveData(cardsList)
*/
class AttendanceListViewModelFactory : ViewModelProvider.Factory { fun insertCard(cardId: String) {
val card = Card(cardId)
cardsList.add(card)
}
}
//@Suppress("UNCHECKED_CAST") class AttendanceListViewModelFactory : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(AttendanceListViewModel::class.java)) { //@Suppress("UNCHECKED_CAST")
return AttendanceListViewModel( override fun <T : ViewModel> create(modelClass: Class<T>): T {
attendanceRepository = AttendanceRepository( if (modelClass.isAssignableFrom(AttendanceListViewModel::class.java)) {
dataSource = ServerDataSource() return AttendanceListViewModel(
) attendanceRepository = AttendanceRepository(
) as T dataSource = ServerDataSource()
} )
throw IllegalArgumentException("Unknown ViewModel class") ) as T
} }
throw IllegalArgumentException("Unknown ViewModel class")
} }
} }

View file

@ -1,57 +0,0 @@
package com.example.palto.ui.attendanceList.placeholder
import java.util.ArrayList
import java.util.HashMap
/**
* Helper class for providing sample content for user interfaces created by
* Android template wizards.
*
* TODO: Replace all uses of this class before publishing your app.
*/
object PlaceholderContent {
/**
* An array of sample (placeholder) items.
*/
val ITEMS: MutableList<PlaceholderItem> = ArrayList()
/**
* A map of sample (placeholder) items, by ID.
*/
val ITEM_MAP: MutableMap<String, PlaceholderItem> = HashMap()
private val COUNT = 25
init {
// Add some sample items.
for (i in 1..COUNT) {
addItem(createPlaceholderItem(i))
}
}
private fun addItem(item: PlaceholderItem) {
ITEMS.add(item)
ITEM_MAP.put(item.id, item)
}
private fun createPlaceholderItem(position: Int): PlaceholderItem {
return PlaceholderItem(position.toString(), "Item " + position, makeDetails(position))
}
private fun makeDetails(position: Int): String {
val builder = StringBuilder()
builder.append("Details about Item: ").append(position)
for (i in 0..position - 1) {
builder.append("\nMore details information here.")
}
return builder.toString()
}
/**
* A placeholder item representing a piece of content.
*/
data class PlaceholderItem(val id: String, val content: String, val details: String) {
override fun toString(): String = content
}
}

View file

@ -6,7 +6,6 @@ import androidx.lifecycle.ViewModel
import android.util.Patterns import android.util.Patterns
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.palto.data.repository.LoginRepository import com.example.palto.data.repository.LoginRepository
import com.example.palto.data.Result
import com.example.palto.R import com.example.palto.R
import com.example.palto.data.network.ServerDataSource import com.example.palto.data.network.ServerDataSource

View file

@ -1,13 +1,7 @@
package com.example.palto.ui.sessionList package com.example.palto.ui.sessionList
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import android.util.Patterns
import com.example.palto.data.repository.LoginRepository import com.example.palto.data.repository.LoginRepository
import com.example.palto.data.Result
import com.example.palto.R
class SessionListViewModel(private val loginRepository: LoginRepository) : ViewModel() { class SessionListViewModel(private val loginRepository: LoginRepository) : ViewModel() {
/* /*

View file

@ -5,14 +5,7 @@
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
android:id="@+id/item_number" android:id="@+id/card_̤id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin"
android:textAppearance="?attr/textAppearanceListItem" />
<TextView
android:id="@+id/content"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/text_margin" android:layout_margin="@dimen/text_margin"