<repo_name>leofusco89/AndroidAvanzadoClase02<file_sep>/settings.gradle
include ':app'
rootProject.name='AndroidAvanzadoClase02'
<file_sep>/app/src/main/java/com/example/androidavanzadoclase02/utils/UsersFactory.kt
package com.example.androidavanzadoclase02.utils

import com.example.androidavanzadoclase02.models.User

class UsersFactory private constructor(){

    companion object{
        private  var sInstance: UsersFactory? = null

        fun getInstance(): UsersFactory{
            //sInstance si no es null, llama al constuctor
            sInstance = sInstance ?: UsersFactory()

            return sInstance!!
        }
    }

    private var userList: MutableList<User>? = null

    init {
        userList = ArrayList()
        addUsers()
    }

    private fun addUsers(){
        val user1 = User(0, "Juan", "juan.com", "4143-1243")
        val user2 = User(1, "Martina", "martina.com", "4555-1555")
        val user3 = User(2, "José", "jose.com", "4666-1666")

        userList!!.add(user1)
        userList!!.add(user2)
        userList!!.add(user3)
    }

    fun getAllUsers(): List<User>{
        return userList!!
    }

    fun getUserById(id: Int): User{
        return userList!![id]
    }


}<file_sep>/app/src/main/java/com/example/androidavanzadoclase02/UsersAdapter.kt
package com.example.androidavanzadoclase02

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import com.example.androidavanzadoclase02.models.User

class UsersAdapter( private var users: List<User>): BaseAdapter() {
    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        val vista = p1 ?: LayoutInflater.from(p2!!.context).inflate(R.layout.item_user, p2, false)

        var tvUserName = vista.findViewById<TextView>(R.id.tv_user_name)
        var tvUserWebsite = vista.findViewById<TextView>(R.id.tv_user_website)
        tvUserName.text = getItem(p0).name
        tvUserWebsite.text = getItem(p0).website
        return vista
    }

    override fun getItem(p0: Int): User {
        return users[p0]
    }

    override fun getItemId(p0: Int): Long {
        return users[p0].id.toLong()
    }

    override fun getCount(): Int {
        return users.size
    }
}<file_sep>/app/src/main/java/com/example/androidavanzadoclase02/MainActivity.kt
package com.example.androidavanzadoclase02

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast

class MainActivity : AppCompatActivity(), UsersListFragment.OnUserSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()
        var userListFragment = UsersListFragment()

        fragmentTransaction.add(R.id.fragment_container, userListFragment)
        fragmentTransaction.commit()
    }

    override fun onUserSelected(userId: Int) {

        val userDetailFragment = UserDetailFragment.newInstance(userId)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.fragment_container, userDetailFragment)
            .addToBackStack(null) //Agregamos el fragment al stack, así al volver, no sale de la app,
            //sino que vuelve a cargar el anterior, ejecuta su ciclo post onCreate, no ejecuta el onCreate
            //pero sí el resto del ciclo. Recibe un texto que identifica la transacción, pero no lo vamos a usar
            .commit()
    }
}
<file_sep>/app/src/main/java/com/example/androidavanzadoclase02/UsersListFragment.kt
package com.example.androidavanzadoclase02

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.androidavanzadoclase02.models.User
import com.example.androidavanzadoclase02.utils.UsersFactory
import kotlinx.android.synthetic.main.fragment_users_list.*
import java.lang.ClassCastException

class UsersListFragment : Fragment() {
    private lateinit var users: List<User>
    private lateinit var adapter: UsersAdapter
    private lateinit var listener: OnUserSelectedListener

    //Para que las activities implementen el método
    interface OnUserSelectedListener{
        fun onUserSelected(userId: Int)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val factory = UsersFactory.getInstance()
        users = factory.getAllUsers()
        adapter = UsersAdapter(users)
    }

    override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_users_list, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        lv_users_list.adapter = adapter
        lv_users_list.setOnItemClickListener { _, _, _, id ->
            listener.onUserSelected(id.toInt())
        }
    }

    override fun onAttach(context: Context?) {
        super.onAttach(context)
        //Acá guardamos la activity que llama a este fragment, para poder usarla después y saber
        //en que fragment hay que hacer cambios, sino no sabemos, basicamente guardamos el
        //contexto de la instancia que se está cargando
        try {
            listener = context as OnUserSelectedListener
        }catch (ex: ClassCastException){
            throw ClassCastException("Tenés que implementar la interfaz OnUserSelectedListener desde la activity")
        }
    }
}<file_sep>/app/src/main/java/com/example/androidavanzadoclase02/UserDetailFragment.kt
package com.example.androidavanzadoclase02

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.androidavanzadoclase02.utils.UsersFactory
import kotlinx.android.synthetic.main.fragment_user_detail.*

class UserDetailFragment: Fragment() {

    companion object{
        private const val USER_ID = "USER_ID" //const obliga a dar valor hardcodeado, solo puede usarse en companion o por fuera de la clase

        fun newInstance(userId: Int): UserDetailFragment { //Llamado newInstance por convención
            //Recibe por parámetro el número de usuario y vamos a devolver una instancia
            //con el dato de usuario

            val userDetailFragment = UserDetailFragment()
            //Creamos un argumento/bundle, que es un paquete de datos y que sirve para que no se
            //pierdan datos cuando se destruya el fragment, por ejemplo, para cuando vemos otra
            //app y volvemos a la nuestra, debemos volver a cargarla y necesitamos saber que
            //usuario cargar:
            val args = Bundle()
            args.putInt(USER_ID, userId)

            //Le pasamos el argumento a la instancia del fragment para que no se pierda ese dato
            userDetailFragment.arguments = args
            return userDetailFragment
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? {
        return inflater.inflate(R.layout.fragment_user_detail, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        //Acá vamos a recuperar el valor del usuario para asignarlo en el TextView
        val factory = UsersFactory.getInstance()
        val userId = arguments!!.getInt(USER_ID)
        val user = factory.getUserById(userId)
        tv_user_name_detail.text = user.name
    }
}