Avisos

Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 12/10/18, 13:04:29
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
Pasar variable

Tengo un problema desde hace tiempo que me gustaria solucionar:
Tengo un fragment con botones, que al pulsar un boton tengo la variable *dato que me paso a la url que quiero abrir.

Código PHP:
val  button01 view.findViewById(R.id.tv_01) as Button
button01
.setOnClickListener{
dato "01"
miTexto.setText("Jornada - 01")
    
requestJsonObject()
 } 
</div>

Código PHP:
val url Directions.JORNADAS Directions.CMP "&jor=$dato&tmp=" Directions.TMP 
Esta url esta claro que me la abre, es un json el cual parseo y ya paso al adaptador y me lo muestra.


Desde el adaptador paso datos, que vienen en el Json con un intent put.extras, al activity detalles.kt el cual depende del item que pulso me muestra los datos de otra url.

<div>
Código PHP:
val intent Intent(contextDetalles::class.java
holder
.itemView.setOnClickListener{  
     
intent.putExtra("nomLocal"jornada.nomLocal)context.startActivity(intent)...... 
</div>

Hasta aqui todo bien.


Mi problema: necesito pasar la variable dato al activity Detalles.kt para poder acceder a la url, puesto que *dato es un trozo de url de lo que voy a parsear en el activity Detalles


Yo abia pensado en agregar un item al Json


Código PHP:
private fun requestJsonObject() {

    
val queue newRequestQueue(activity)

    
//http://www.ffcv.es/ncompeticiones/server.php?action=getResultados&cmp=328&jor=1&tmp=2018/2019

val url Directions.JORNADAS Directions.CMP "&jor=$dato&tmp=" Directions.TMP

val stringRequest 
StringRequest(Request.Method.GETurlResponse.Listener response ->

val builder GsonBuilder()
        
val mGson builder.create()

        
val items: List<ModelJor>

        
items Arrays.asList(*mGson.fromJson(response, Array<ModelJor>::class.java))

        
items.add(ModelJor("\"jornada\":" $dato)) // dato en rojo
Log.d("Resultado"items.toString())

        
recyclerView !!.layoutManager GridLayoutManager(activity!!, 1)

        
val adapter AdapJor(activity !!, items)
        
recyclerView !!.adapter adapter

    
}, Response.ErrorListener error -> Log.d(TAG"Error " error.message) })
    
queue.add(stringRequest)
 } 
</div>

Alguna solucion?
Responder Con Cita

HILOS_Honor

  #2  
Viejo 12/10/18, 23:02:23
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

A lo mejor no he entendido la duda, así que disculpa si la respuesta es muy obvia, ¿y no puedes pasar el dato en el intent a la actividad, igual que ya haces con nomLocal? Al fin y al cabo ese es el mecanismo habitual para pasar datos a las actividades.
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 13/10/18, 09:55:47
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
A lo mejor no he entendido la duda, así que disculpa si la respuesta es muy obvia, ¿y no puedes pasar el dato en el intent a la actividad, igual que ya haces con nomLocal? Al fin y al cabo ese es el mecanismo habitual para pasar datos a las actividades.
alguna otra manera que no sea asi?

Código PHP:
button2.setOnClickListener {
    
dato "02"
    
miTexto.setText("Jornada - 2")   

    
val intent Intent(contextDetalles::class.java)
    
intent.putExtra("jor"dato)
     
context!!.startActivity(intent)
 
requestJsonObject()
 } 

Última edición por Merche300 Día 13/10/18 a las 10:01:09.
Responder Con Cita
  #4  
Viejo 15/10/18, 12:21:05
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Si la actividad Detalles es la que se conecta con una URL y se baja la información, en vez de andar pasando trozos de URL para que la actividad la complete, lo que haría es pasarle la URL entera en el intent. Así de paso es más fácil de probar la actividad también porque podrías pasarle URLs de prueba, de un servidor local por ejemplo, sin tener que modificar el código de la actividad.

En cualquier caso, todo se reduce a qué información necesita la actividad y quién puede dársela o de dónde puede obtenerla.

Hay cosas del onClickListener que pones que no entiendo, haces un startActivity para iniciar Detalles pero en el mismo trozo de código cambias una etiqueta y llamas al método requestJsonObject que de poco vale cuando la actividad va a morir porque se va a iniciar otra y va a dejar de estar visible. Si fuera un fragment todavía, pero conectarse a una URL en una actividad cuando ya has pedido iniciar una nueva es innecesario.

Al requestJsonObject lo tendrá que llamar la actividad Detalles cuando arranque, no el listener de la actividad anterior.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas! Acepta el reto en iOS: 5/Puzzles
Responder Con Cita
Gracias de parte de:
  #5  
Viejo 17/10/18, 23:12:09
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
no me habre explicado bien, la varable dato, es parte de la url que al pulsar el boton 2 la variable en vez de j_01 pasa a ser j_02 y asi hasta 30 botones.



Código:
class FragJor : Fragment() {

    var dato = "j_01"

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

        requestJsonObject()
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.jornadas_todas, container, false)

        val miTexto: TextView = view.findViewById(R.id.tv_Grupo)
        miTexto.text = (getString(R.string.list_juveniles))

        val button1 = view.findViewById(R.id.tv_01) as Button
        button1.setOnClickListener {
dato = "j_01"
miTexto.text = (getString(R.string.Jornada_1))
            requestJsonObject()
        }
val button2 = view.findViewById(R.id.tv_02) as Button
        button2.setOnClickListener {
dato = "j_02"
miTexto.text = (getString(R.string.Jornada_2))
            requestJsonObject()
        }

   // 30 botones
return view
    }


    private fun requestJsonObject() {

        val queue = newRequestQueue(activity)

        //http://www.ffcv.es/ncompeticiones/server.php?action=getResultados&cmp=328&jor=1&tmp=2018/2019
val url = Directions.JORNADAS + Directions.CMP + "&jor=$dato&tmp=" + Directions.TMP
val stringRequest = StringRequest(Request.Method.GET, url, Response.Listener { response ->
val builder = GsonBuilder()
            val mGson = builder.create()

            val items: List<ModelJor>

            items = Arrays.asList(*mGson.fromJson(response, Array<ModelJor>::class.java))
            Log.d("Resultado", items.toString())

            recyclerView !!.layoutManager = GridLayoutManager(activity!!, 1)

            val adapter = AdapJor(activity !!, items)
            recyclerView !!.adapter = adapter


        }, Response.ErrorListener { error -> Log.d("Tag", "Error " + error.message) })
        queue.add(stringRequest)
    }
}
El adaptador, recibe el json de la url que obtengo al meter la variable dato en la url y envio unos items que me hacen falta para completar la url que he de parsear desde el activity Detalles como el .idLocal, idVisitante


Código:
class AdapJor(internal var context: Context, internal var listJornadas: List<ModelJor>) : RecyclerView.Adapter<AdapJor.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.jornadas_row, parent, false)
        return ViewHolder(itemView)
    }

    @RequiresApi(Build.VERSION_CODES.O)
    @SuppressLint("SetTextI18n")
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val jornada = listJornadas[position]

        val intent = Intent(context, Detalles::class.java)

        holder.itemView.setOnClickListener{
//Toast.makeText(context, "lo que quiero", Toast.LENGTH_SHORT).show()

            intent.putExtra("nomLocal", jornada.nomLocal)
            intent.putExtra("nomVisi", jornada.nomVisitante)
            intent.putExtra("idLocal", "" + jornada.idLocal)
            intent.putExtra("idClubLocal", "" + jornada.idClubLocal)
            intent.putExtra("idVisitante", "" + jornada.idVisitante)
            intent.putExtra("idClubVisitante", "" + jornada.idClubVisitante)
            intent.putExtra("codInfo", "" + jornada.codInfo)
            intent.putExtra("fecha", jornada.fecha + "  " + jornada.hora)
            intent.putExtra("esLocal", "http://ffcv.es/ncompeticiones/" + jornada.escudoLocal)
            intent.putExtra("esVisi", "http://ffcv.es/ncompeticiones/" + jornada.escudoVisitante)
            intent.putExtra("resultado", jornada.resulLocal + " - " + jornada.resulVisitante)
            context.startActivity(intent)
        }
val fecha = jornada.fecha


if (fecha == ""){
            holder.textFecha.text = ""

}else{

            val fecha = jornada.fecha + Directions.ANYO1
val parser = SimpleDateFormat("dd/MM/yyyy")
            val date = parser.parse(fecha) as Date
            val espanol = Locale("es", "ES")
            val formatter = SimpleDateFormat("EEEE dd 'de' MMMM 'del 'yyyy \n'  a las '", espanol)
            holder.textFecha.text = (formatter.format(date)) + jornada.hora
}


        //holder.textFecha.text = jornada.fecha + jornada.hora
holder.textEquipoLocal.text = jornada.nomLocal
holder.textResulLocal.text = jornada.resulLocal
holder.textEstado.text = jornada.estadoPartido
holder.textResulVisi.text = jornada.resulVisitante
holder.textEquipovisi.text = jornada.nomVisitante
//holder.textArbitro.text = jornada.arbitro

if(jornada.resulLocal!! < jornada.resulVisitante.toString()) {
            holder.textResulLocal.setTextColor(Color.RED)
            holder.textResulVisi.setTextColor(Color.GREEN)

        }else if(jornada.resulLocal!! > jornada.resulVisitante.toString()) {
            holder.textResulLocal.setTextColor(Color.GREEN)
            holder.textResulVisi.setTextColor(Color.RED)
        }

        Picasso.get()
                .load("http://ffcv.es/ncompeticiones/" + jornada.escudoLocal)
                .placeholder(R.mipmap.ic_launcher_round)
                .resize(50, 50)
                .centerCrop()
                .into(holder.imageEscLocal)

        Picasso.get()
                .load("http://ffcv.es/ncompeticiones/" + jornada.escudoVisitante)
                .placeholder(R.mipmap.ic_launcher_round)
                .resize(50, 50)
                .centerCrop()
                .into(holder.imageEscVisi)
    }

    override fun getItemCount(): Int = listJornadas.size

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        var textFecha: TextView = itemView!!.findViewById(R.id.tv_Fecha)as TextView
        var textEstado: TextView = itemView!!.findViewById(R.id.tv_Estado) as TextView
        var textEquipoLocal: TextView = itemView!!.findViewById(R.id.tv_Amarillas) as TextView
        var textResulLocal: TextView = itemView!!.findViewById(R.id.tv_Result_Local)as TextView
        var imageEscLocal: CircleImageView = itemView!!.findViewById(R.id.tv_esc_local) as CircleImageView
        var textEquipovisi: TextView = itemView!!.findViewById(R.id.tv_Equipo_Visitante) as TextView
        var textResulVisi: TextView = itemView!!.findViewById(R.id.tv_Result_Visitante) as TextView
        var imageEscVisi: CircleImageView = itemView!!.findViewById(R.id.tv_esc_visi) as CircleImageView

    }
}
y el activity detalles que me fatla la variable dato del FragJornadas para completar la url


Código:
val URL_ACTA = "http://www.ffcv.es/ncompeticiones/server.php?action=getActa&tmp=$temporada&jor=$dato$competicion&idl=$idLocal&idv=$idVisitante&id=$codInfo"
y aqui dejo todo el activity Detalles por si lo quieres.



En el activity Detalles es donde quiero que llege la variable $dato del FragJornadas y no tengo ni idea de como hacerlo.


Código:
class Detalles : AppCompatActivity() {



    private var toolbar: Toolbar? = null

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

        toolbar = findViewById(R.id.toolbarDetalles) as Toolbar
        setSupportActionBar(toolbar)

        supportActionBar!!.setDisplayHomeAsUpEnabled(true)


        val jor = intent.getStringExtra("jor")

        if (jor != null) {

            collapsing_toolbar.setTitle("Jornada " + jor)

            collapsing_toolbar.setExpandedTitleColor(Color.WHITE)
            collapsing_toolbar.setCollapsedTitleTextColor(Color.BLACK)
        }else{

            collapsing_toolbar.setTitle("si " + jor)


        }



        val tvfecha = intent.getStringExtra("fecha")
        val tv_fecha: TextView= findViewById<TextView>(R.id.tv_Fecha) as TextView
        tv_fecha.setText(tvfecha)

        val tvnomlocal = intent.getStringExtra("nomLocal")
        val tv_nomlocal: TextView= findViewById<TextView>(R.id.tv_Equipo_Local) as TextView
        tv_nomlocal.setText(tvnomlocal)

        val tvresultado = intent.getStringExtra("resultado")
        val tv_resultado: TextView= findViewById<TextView>(R.id.tv_Resultado) as TextView
        tv_resultado.setText(tvresultado)

        val nomvisi = intent.getStringExtra("nomVisi")
        val tv_nomvisi: TextView= findViewById<TextView>(R.id.tv_Equipo_Visitante) as TextView
        tv_nomvisi.setText(nomvisi)


        Picasso.get()
                .load(getIntent().getStringExtra("esLocal"))
                .resize(70, 90)
                //.noFade()
                //.transform(CircleTransform())
.into(tv_EscLocal)

        Picasso.get()
                .load(getIntent().getStringExtra("esVisi"))
                .resize(80, 80)
                //.noFade()
                //.transform(CircleTransform())
.into(tv_EscVisi)

        //recycler_TitLocal.visibility = View.GONE

tv_TitLocal.setOnClickListener{
if (recycler_TitLocal.visibility == View.GONE){

                recycler_TitLocal.visibility = View.INVISIBLE
}else{
                recycler_TitLocal.visibility = View.GONE
}
        }
parseDetalles()
    }

    companion object {

        private var currentPosition = 0
}

    private fun parseDetalles() {

        val idLocal = intent.getStringExtra("idLocal").toString()
        val idVisitante = intent.getStringExtra("idVisitante").toString()
        val codInfo = intent.getStringExtra("codInfo").toString()



        val temporada = "2018/2019" //Temporada
val competicion = "&cmp=328" //Competicion

val TMP = "2018/2019" //Temporada
val ID_ENCUENTROS = "&id=0201045201&cmp="
val CMP = "328" //Competicion

val jornada = intent.getStringExtra("jor")
        //val URL = "http://www.ffcv.es/ncompeticiones/server.php?action=getActa&tmp=2017/2018&jor=3&cmp=48&idl=0201073211&idv=0201128231&id=2127995"
val URL_ACTA = "http://www.ffcv.es/ncompeticiones/server.php?action=getActa&tmp=$temporada&jor=$dato$competicion&idl=$idLocal&idv=$idVisitante&id=$codInfo"

val URL_ARBITRO = "http://www.ffcv.es/ncompeticiones/server.php?action=getEncuentro&tmp=$temporada&cod=$codInfo&idl=$idLocal&idv=$idVisitante"
//val URL_ARBITRO = "http://www.ffcv.es/ncompeticiones/server.php?action=getEncuentro&tmp=2018/2019&cod=2554270&idl=0204013521&idv=0201045201"

val queue = Volley.newRequestQueue(this)

        val jsonObjReq = JsonObjectRequest(Request.Method.GET, URL_ACTA,
                null,
com.android.volley.Response.Listener<JSONObject> { response ->
setUpAcAdapter(response)
                },
com.android.volley.Response.ErrorListener {
                })

        MyApplication.instance?.addToRequestQueue(jsonObjReq, "json_request")

        queue.add(jsonObjReq)

        val jsonObjReq2 = JsonObjectRequest(Request.Method.GET, URL_ARBITRO,
                null,
com.android.volley.Response.Listener<JSONObject> { response ->
setUpArbAdapter(response)
                },
com.android.volley.Response.ErrorListener {
                })

        MyApplication.instance?.addToRequestQueue(jsonObjReq2, "json_request")

        queue.add(jsonObjReq2)
    }

    private fun setUpArbAdapter(response: JSONObject) {
        //initialize gson object
val gson = Gson()

        //get data from gson and assign to object
val actaPartido = gson.fromJson<ActaPartidoArray>(response.toString(), ActaPartidoArray::class.java)

        val Arbitro = actaPartido.infoGeneral?.arbitroPrincipal

val tv_arbitro: TextView= findViewById<TextView>(R.id.tv_Arbitro) as TextView

        tv_arbitro.setText(Arbitro)
    }



    private fun setUpAcAdapter(response: JSONObject) {
        //initialize gson object
val gson = Gson()

        //get data from gson and assign to object
val actaPartido = gson.fromJson<ActaPartidoArray>(response.toString(), ActaPartidoArray::class.java)
        val titularesLocal = actaPartido.tituLocal
val golesLocal = actaPartido.golesLocal
val tituVisi = actaPartido.tituVisi
val golesVisitante = actaPartido.golesVisitante
val Targetalocal = actaPartido.amonestacionesLocal
val Targetavisi = actaPartido.amonestacionesVisi
val Suplentelocal = actaPartido.suplentesLocal
val Suplentevisi = actaPartido.suplentesVisitante


recycler_TitLocal.layoutManager = GridLayoutManager(this, 1)
        recycler_TitVisi.layoutManager = GridLayoutManager(applicationContext, 1)
        recycler_GolLocal.layoutManager = GridLayoutManager(applicationContext, 1)
        recycler_GolVisitante.layoutManager = GridLayoutManager(applicationContext, 1)
        recycler_TargetaLocal.layoutManager = GridLayoutManager(applicationContext, 1)
        recycler_TargetaVisi.layoutManager = GridLayoutManager(applicationContext, 1)
        recycler_SuplentesLocal.layoutManager = GridLayoutManager(applicationContext, 1)
        recycler_SuplentesVisi.layoutManager = GridLayoutManager(applicationContext, 1)

        val adapter_TitLocal = ActaLocalAdapter(this, titularesLocal !!)
        recycler_TitLocal.adapter = adapter_TitLocal

        val adapter_TitVisi = ActaVisiAdapter(this, tituVisi !!)
        recycler_TitVisi.adapter = adapter_TitVisi

        val adapter_GolesLocal = ActaLocalAdapter(this, golesLocal !!)
        recycler_GolLocal.adapter = adapter_GolesLocal

        val adapter_GolesVisitante = ActaVisiAdapter(this, golesVisitante !!)
        recycler_GolVisitante.adapter = adapter_GolesVisitante

        val adapter_TarLocal = ActaLocalAdapter(this, Targetalocal !!)
        recycler_TargetaLocal.adapter = adapter_TarLocal

        val adapter_TarVisi = ActaVisiAdapter(this, Targetavisi !!)
        recycler_TargetaVisi.adapter = adapter_TarVisi

        val adapter_SuplenteLocal = ActaLocalAdapter(this, Suplentelocal !!)
        recycler_SuplentesLocal.adapter = adapter_SuplenteLocal

        val adapter_SuplenteVisi = ActaVisiAdapter(this, Suplentevisi !!)
        recycler_TargetaVisi.adapter = adapter_SuplenteVisi

    }


}
Espero haberme explicado bien ahora.

Última edición por Merche300 Día 17/10/18 a las 23:23:27.
Responder Con Cita
  #6  
Viejo 18/10/18, 12:16:18
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Dime que no has hecho copy-paste 30 veces del mismo código cambiando un número cada vez, ¡que me asusto! XDDD

Al grano, a ver si me entero jaja, tienes una actividad (¿qué actividad es esa?) donde hay un fragment FragJor con 30 botones. Cuando aprietas un botón ¿qué es lo que tiene que hacer exactamente? Ahora mismo veo que tienes un listener que llama a un requestJsonObject que cambia un par de etiquetas y puebla un recycler view. Pero seguimos en la misma actividad, ¿correcto?

Ese recycler view parece que tiene una lista de lo que has recibido en el json, que al pulsar en un elemento se abre la actividad Detalles con un montón de extras que le pasas. O sigo sin entenderlo o parece que únicamente te falta añadir otro extra con el "dato" y leerlo en Detalles igual que haces ahora con el resto de extras.

¿Me estoy perdiendo algo?
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas! Acepta el reto en iOS: 5/Puzzles
Responder Con Cita
Gracias de parte de:
  #7  
Viejo 18/10/18, 19:24:17
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Dime que no has hecho copy-paste 30 veces del mismo código cambiando un número cada vez, ¡que me asusto! XDDD

Al grano, a ver si me entero jaja, tienes una actividad (¿qué actividad es esa?) donde hay un fragment FragJor con 30 botones. Cuando aprietas un botón ¿qué es lo que tiene que hacer exactamente? Ahora mismo veo que tienes un listener que llama a un requestJsonObject que cambia un par de etiquetas y puebla un recycler view. Pero seguimos en la misma actividad, ¿correcto?

Ese recycler view parece que tiene una lista de lo que has recibido en el json, que al pulsar en un elemento se abre la actividad Detalles con un montón de extras que le pasas. O sigo sin entenderlo o parece que únicamente te falta añadir otro extra con el "dato" y leerlo en Detalles igual que haces ahora con el resto de extras.

¿Me estoy perdiendo algo?


Tengo un Fragment, donde estan los 30 botones, el adaptador y Detalles que es elactivity

Si, copy paste los 30 botones.
Si, lo que quiero es otro extra con el "dato" para leerlo en detalles.
No te asustes mucho. Jajaja

Última edición por Merche300 Día 18/10/18 a las 19:35:12.
Responder Con Cita
  #8  
Viejo 18/10/18, 20:07:12
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

¿Y cuál es el problema entonces? intent.putExtra("dato", dato) en el adapter y getStringExtra("dato") en Detalles

Sobre el copy paste, ¡¡usa un bucle!! Y un array con la información específica de los 30 botones como el id. Y así no tienes que escribir el mismo código 30 veces, que luego para cambiar algo es una fuente de errores que imagínate.

Última edición por mocelet Día 18/10/18 a las 20:09:13.
Responder Con Cita
  #9  
Viejo 18/10/18, 23:11:25
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
¿Y cuál es el problema entonces? intent.putExtra("dato", dato) en el adapter y getStringExtra("dato") en Detalles

Sobre el copy paste, ¡¡usa un bucle!! Y un array con la información específica de los 30 botones como el id. Y así no tienes que escribir el mismo código 30 veces, que luego para cambiar algo es una fuente de errores que imagínate.

El problema? facil, los extras que tengo vienen del json y el $dato lo he de pasar al pulsar el boton


Código:
intent.putExtra("dato", dato)

pues que dato me sale en rojo, ya lo intente sin esperanzas.
encuanto al bucle ni idea de como hacerlo, pero para mi lo importante es como pasar $dato

Última edición por Merche300 Día 19/10/18 a las 06:39:55.
Responder Con Cita
  #10  
Viejo 19/10/18, 07:57:56
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Dato te sale en rojo porque en el adapter no tienes la variable dato, añade un parámetro al constructor del adapter por ejemplo y pásaselo al crearlo. Al fin y al cabo cuando creas el adapter ya sabes a qué jornada pertenece.

Es más un problema de visibilidad (scope) de variables que otra cosa. La variable dato la creas en un sitio y te hace falta en otro. Ahí o la vas pasando entre métodos o la conviertes en atributo de clase.

En el caso de requestJsonObject parece razonable que le pases directamente el parámetro dato al método.

Última edición por mocelet Día 19/10/18 a las 08:58:22.
Responder Con Cita
Gracias de parte de:
  #11  
Viejo 19/10/18, 20:48:05
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
Pues no se hacerlo y si copy paste los 30 botones
Responder Con Cita
  #12  
Viejo 19/10/18, 21:59:51
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Cómo no vas a saber añadir un parámetro a una función y a un constructor.

Esto es lo que tienes para cada botón:

Código:
dato = "j_01"
miTexto.text = (getString(R.string.Jornada_1))
requestJsonObject()
Dentro de requestJsonObject necesitas dato pero no lo tienes porque te sale en rojo, pues pásalo como parámetro, cambia la definición de requestJsonObject() por requestJsonObject(dato: String) y llámalo con requestJsonObject(dato) en los listener del botón.

Luego, en el adaptador tres cuartos de lo mismo, pero en vez de parámetro de una función en el constructor:

class AdapJor(internal var context: Context, internal var listJornadas: List<ModelJor>, val dato: String)

Con eso estaría resuelto el tema dato. Que, bueno, llamarlo dato es como no decir nada, todas las variables de un programa son datos Usar nombres descriptivos ayuda.

Ahora, lo del código repetido 30 veces tenía que haberte empezado a oler mal al segundo copy paste, o al tercero como mucho jaja. El código es exactamente igual en todos los botones, cambia el dato, el identificador de String y el identificador del botón. Mi sugerencia es crear una data class con esos tres atributos y crear un array que tenga 30 elementos de esa clase, de modo que el primero pertenezca a la primera jornada (j_01, R.string.Jornada_1 y R.id.tv_01), el segundo a la segunda, etc.

Con eso puedes convertir tu copy-paste de 30 veces en un bucle que lo escribes una vez y se ejecuta 30 veces, una con cada conjunto de datos de la jornada. Tener 5 líneas de código en vez de 150 es mucho más manejable y menos propenso a errores.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas! Acepta el reto en iOS: 5/Puzzles
Responder Con Cita
Gracias de parte de:
  #13  
Viejo 20/10/18, 09:32:40
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
Casi siempre pongo dato a lo que hago nuevo, luego le doy el nombre, es una forma de no equivocarme del lo que estoy haciendo con lo que tengo hecho.
Cambiando la linea del adaptador
Código:
class AdapJor(internal var context: Context, internal var listJornadas: List<ModelJor>, var dato: String) : RecyclerView.Adapter<AdapJor.ViewHolder>() {
en el FragJor me sale errores aqui:
como paso *dato en esta linea?
Código:
val adapter = AdapJor(activity !!, items)
el parentesis final subrayado en rojo

En cuanto a los botones sabes de algun tuto o algo? En tal caso abrire otro post, no tienenada que ver con esto.

Última edición por Merche300 Día 20/10/18 a las 11:04:58.
Responder Con Cita
  #14  
Viejo 20/10/18, 12:59:44
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Creo que alguna vez kriogeN te comentó algo parecido, no te lo tomes a mal pero antes de meterse con Android conviene tener muy muy claros los conceptos de programación orientada a objetos.

AdapJor es una clase y a su constructor le hemos añadido un tercer parámetro (dato). Lógicamente, si no se le da un valor no puede construirse el objeto, por eso sale en rojo. El propio Android Studio te dice cuál es el problema, deberías poder "tirar del hilo". Al fin y al cabo es como cualquier constructor, añade dato al final, es el tercer parámetro.

A veces tengo la impresión de que te lías a pegar código o hacer cambios que te comentamos sin pararte un momento a tener claro el porqué o revisar los conceptos involucrados.

Sobre el bucle, tutoriales no creo que encuentres, no es más que un bucle for, un array o lista y una estructura de datos. Lo típico de recorrer elementos de un array con un bucle. Repasa los conceptos de for, las data class y las listas de Kotlin y luego lo vemos si se te resiste.

Última edición por mocelet Día 20/10/18 a las 13:57:41.
Responder Con Cita
Gracias de parte de:
  #15  
Viejo 21/10/18, 16:59:24
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
mocelet, muchas gracias, conseguido lo importante y con su nonbre dato cambia a ser jornada:


Código:
var jornada = "j_01"
y he leidomucho pero lo consegui, el parentesis en rojo.

Código:
val adapter = AdapJor(activity !!, items, jornada)
Responder Con Cita
  #16  
Viejo 22/10/18, 12:12:03
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Te cuento lo de los botones para el día que quieras quitar el código duplicado, aunque te recomiendo que si lo cambias sepas qué estás haciendo y en qué consisten los cambios :) Más que nada porque si no igual te salen mil cosas rojas y es peor el remedio que la enfermedad.

Dentro de la actividad definimos una estructura de datos (JornadaRes) para almacenar los datos específicos de cada jornada, es decir, las cosas que cambiabas a mano cada vez que hacías un copy paste (identificador de vista, identificador de texto y la string que te hace falta para el servidor)

Código:
data class JornadaRes(val viewId: Int, val labelId: Int, val jornada: String)
Ahora que ya tenemos los datos modelados, creamos una lista con la información específica de cada jornada. Es un atributo de la clase también, ponlo arriba del todo, no dentro de ningún método/función.

Código:
    
    private val jornadasResources = listOf(
            JornadaRes(R.id.tv_01, R.string.Jornada_1, "j_01"),
            JornadaRes(R.id.tv_02, R.string.Jornada_2, "j_02"),
            JornadaRes(R.id.tv_03, R.string.Jornada_3, "j_03"),
            // Idem con todas las demás
    )
Con esto podemos convertir tu copy paste de 30 veces en un único bucle, al fin y al cabo haces lo mismo con todos los botones cambiando esos tres valores:

Código:
        jornadasResources.forEach {res ->
            val button = view.findViewById<Button>(res.viewId)
            button.setOnClickListener {
                miTexto.setText(res.labelId)
                requestJsonObject(res.jornada)
            }
        }
Puede ponerse más bonito pero he intentado que se parezca a tu código original. En resumen, lo que hace es recorrer todas las tripletas JornadaRes que hemos creado, una para cada jornada. Con cada tripleta de valores (que dentro del bucle se llama res), haces lo que hacías antes, encontrar el botón (con el viewId), crear el listener y dentro asignar la etiqueta del texto (el getString que tenías no hace falta porque es un recurso) y llamar al requestJson con el parámetro.

Eso se repite tantas veces como JornadaRes haya en la lista, siendo funcionalmente idéntico a tus cerca de 200 líneas en apenas 35. Y si necesitas cambiar algo del código del listener no tienes que hacer el mismo cambio 30 veces, lo haces una vez.

Esta solución tiene margen para optimizar más cosas, pero al menos ya no te saltas el principal mantra de la programación: DRY - Don't Repeat Yourself, no te repitas. Cada vez que en una app hay código que es prácticamente igual en varios sitios muere un gatito porque pide a gritos bien sacarlo a una función y llamar a la función en vez de pegar varias líneas (si está en distintos sitios) o poner un bucle (si está repetido en el mismo sitio como tu caso)

En cualquier caso, recalco que antes de hacer los cambios comprendas muy bien los conceptos involucrados, si hace falta deja por aquí este mensaje para más adelante.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas! Acepta el reto en iOS: 5/Puzzles

Última edición por mocelet Día 22/10/18 a las 12:16:06.
Responder Con Cita
  #17  
Viejo 24/10/18, 01:00:28
Array

[xs_avatar]
Merche300 Hombre Merche300 no está en línea
Betatester oficial
 
Fecha de registro: dic 2008
Localización: Valencia
Mensajes: 614
Modelo de smartphone: NEXUS 5 - ONEPLUS 3
Tu operador: Pepephone
mocelet, no sabes la alegria que me da leer todo el currazo que te has pegado, muchas gracias. pero:

Código:
private val jornadasResources = listOf(
private subrayado en rojo lo quito.


Código:
requestJsonObject(res.jornada)
res.jornada subrayado en rojo

En el Logcat: Too many arguments for private final fun requestJsonObject(): Unit defined in com.ramon.rafelcf.Jornadas.FragJor


Bueno el otro dia, domingo, me puse a ver y leer como hacer eso de los botones y tampoco lo consegui, no con data class, sino con array, aqui te lo dejo, aunque no viene mal hacer funcionar tu codigo. Tambien me ahorro 29 Strings.

Esto es lo que hice por si te sirve de algo, si quieres el enlace de donde lo saque no tienes mas que pedirlo:

Código:
val numJor = intArrayOf(R.id.tv_01, R.id.tv_02, R.id.tv_03, R.id.tv_04, R.id.tv_05,
R.id.tv_06, R.id.tv_07, R.id.tv_08, R.id.tv_09, R.id.tv_10, R.id.tv_11, R.id.tv_12,
R.id.tv_13, R.id.tv_14, R.id.tv_15, R.id.tv_16, R.id.tv_17, R.id.tv_18, R.id.tv_19,
R.id.tv_20, R.id.tv_21, R.id.tv_22, R.id.tv_23, R.id.tv_24, R.id.tv_25, R.id.tv_26,
R.id.tv_27, R.id.tv_28, R.id.tv_29, R.id.tv_30)

val button = arrayOfNulls<Button>(numJor.size)

for(i in numJor.indices){
    button[i] = view.findViewById(numJor[i]) as Button
    val buttonValue = i+1
val buttonText = Integer.toString(buttonValue)

    button[i]!!.setOnClickListener {
miTexto.text = getString(R.string.Jornada) + " " + buttonText        
jornada = buttonText
requestJsonObject()
    }
}

Lo que no funciona en ninguno es el requestJsonObject(), no cambia la url.

Última edición por Merche300 Día 24/10/18 a las 06:29:28.
Responder Con Cita
  #18  
Viejo 24/10/18, 08:33:24
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,130
Modelo de smartphone: LG G6

Mi código compila bien, eso de "private sale en rojo pues lo borro" quizá no es la mejor solución jejeje. Imagino que estás poniendo eso dentro de una función no dentro de la clase. Los modificadores como private son para variables de clase.

Sobre el requesrJsonObject, se supone que el tema de la URL ya lo tenías resuelto añadiendo un parámetro, ¿no? Si al final no añadiste el parámetro y has hecho otra cosa distinta entonces es normal que no te compile.

Pero vuelvo a insistir en lo mismo, mientras más quieras avanzar con la app más te va a hacer falta un conocimiento sólido de las bases del lenguaje. Copiar código de otros sitios como inspiración está bien pero hay que saber qué se está copiando y por qué para integrarlo correctamente.

EDIT:
- Ya veo qué es lo que hacías, al final no pasaste el dato jornada por parámetro a requestJsonObject sino que tienes una variable de clase por ahí. En el mensaje de https://www.htcmania.com/showpost.ph...7&postcount=12 te proponía añadir el parámetro jornada a ese método, en vez de tener una variable de clase. Si al final no haces eso, en mi último código tendrías que hacer un jornada = res.jornada y quitar el res.jornada de la llamada a requestJsonObject, aunque creo que mi propuesta es menos propensa a errores.

- Sobre el bucle, el que has hecho no va mal encaminado, de hecho si solo necesitaras la lista de 30 botones y puedes generar el resto de información con el índice entonces la data class sobra. Andar con índices de todas formas es una forma estupenda de equivocarse y siendo 30 tampoco pasa nada por tener 30 strings, aunque parezca repetir texto tener el array con todos los datos encapsulados tiene la ventaja de que puedes cambiar individualmente cada uno si te hiciera falta, o escribirlos con ordinales (3ª jornada), o con letra (Quinta jornada) o como quieras. Si lo haces en código juntando "Jornada" y el índice no puedes jugar con los títulos tanto. En cualquier caso, hay formas mejores de tratar los Strings pero te van a complicar la vida ahora mismo más que solucionar, así que usa la forma que sientas más comodidad, ya habrá tiempo de mejorarlo.

- Lo que no te hace falta para nada es el array de Button (el que inicializas a array de null), en cada iteración del bucle solo necesitas el botón que pertenece al identificador actual, no necesitas guardar nada en un array. Como verás en mi código, yo no guardo los objetos Button en ningún sitio, configuro el listener y me olvido de él.

Última edición por mocelet Día 24/10/18 a las 17:07:38.
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android

Herramientas


Hora actual: 12:38:59 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2018 DragonByte Technologies Ltd.