PDA

Ver la Versión Completa : [ CONSULTA ] Pasar variable


Merche300
12/10/18, 13:04:29
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.

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

val url = Directions.JORNADAS + Directions.CMP + "&jor=$dato&tmp=" + Directions.TMPEsta 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>val intent = Intent(context, Detalles::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


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))

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?

mocelet
12/10/18, 23:02:23
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.

Merche300
13/10/18, 09:55:47
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?

button2.setOnClickListener {
dato = "02"
miTexto.setText("Jornada - 2")

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

mocelet
15/10/18, 12:21:05
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.

Merche300
17/10/18, 23:12:09
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.



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


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.layo ut.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


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.


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.WHI TE)
collapsing_toolbar.setCollapsedTitleTextColor(Colo r.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(jsonObjR eq, "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(jsonObjR eq2, "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.

mocelet
18/10/18, 12:16:18
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?

Merche300
18/10/18, 19:24:17
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

mocelet
18/10/18, 20:07:12
¿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.

Merche300
18/10/18, 23:11:25
¿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



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

mocelet
19/10/18, 07:57:56
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.

Merche300
19/10/18, 20:48:05
Pues no se hacerlo y si copy paste los 30 botones

mocelet
19/10/18, 21:59:51
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:

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 xD 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.

Merche300
20/10/18, 09:32:40
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
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?
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.

mocelet
20/10/18, 12:59:44
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.

Merche300
21/10/18, 16:59:24
mocelet, muchas gracias, conseguido lo importante y con su nonbre dato cambia a ser jornada:


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

val adapter = AdapJor(activity !!, items, jornada)

mocelet
22/10/18, 12:12:03
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)

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.


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:

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.

Merche300
24/10/18, 01:00:28
mocelet, no sabes la alegria que me da leer todo el currazo que te has pegado, muchas gracias. pero:

private val jornadasResources = listOf(private subrayado en rojo lo quito.


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:

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 = view.findViewById(numJor[i]) as Button
val buttonValue = i+1
val buttonText = Integer.toString(buttonValue)

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


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

mocelet
24/10/18, 08:33:24
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.php?p=29510597&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.