|
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 |
|
Herramientas |
#1
|
||||
|
||||
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. [php]val button01 = view.findViewById(R.id.tv_01) as Button button01.setOnClickListener{ dato = "01" miTexto.setText("Jornada - 01") requestJsonObject() }[/php]</div> [php]val url = Directions.JORNADAS + Directions.CMP + "&jor=$dato&tmp=" + Directions.TMP[/php]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>[php]val intent = Intent(context, Detalles::class.java holder.itemView.setOnClickListener{ intent.putExtra("nomLocal", jornada.nomLocal)context.startActivity(intent).... ..[/php]</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 [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.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) }[/php]</div> Alguna solucion? |
|
#2
|
||||
|
||||
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.
|
Gracias de parte de: | ||
#3
|
||||
|
||||
[php]button2.setOnClickListener { dato = "02" miTexto.setText("Jornada - 2") val intent = Intent(context, Detalles::class.java) intent.putExtra("jor", dato) context!!.startActivity(intent) requestJsonObject() }[/php] Última edición por Merche300 Día 13/10/18 a las 10:01:09. |
#4
|
||||
|
||||
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!
|
Gracias de parte de: | ||
#5
|
||||
|
||||
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) } } 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 } } 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" 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 } } Última edición por Merche300 Día 17/10/18 a las 23:23:27. |
#6
|
||||
|
||||
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!
|
Gracias de parte de: | ||
#7
|
||||
|
||||
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. |
#8
|
||||
|
||||
¿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. |
#9
|
||||
|
||||
¿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. |
#10
|
||||
|
||||
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. |
Gracias de parte de: | ||
#11
|
||||
|
||||
Pues no se hacerlo y si copy paste los 30 botones
|
#12
|
||||
|
||||
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() 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!
|
Gracias de parte de: | ||
#13
|
||||
|
||||
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>() { como paso *dato en esta linea? Código:
val adapter = AdapJor(activity !!, items) 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. |
#14
|
||||
|
||||
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. |
Gracias de parte de: | ||
#15
|
||||
|
||||
mocelet, muchas gracias, conseguido lo importante y con su nonbre dato cambia a ser jornada:
Código:
var jornada = "j_01" Código:
val adapter = AdapJor(activity !!, items, jornada) |
#16
|
||||
|
||||
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) 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 ) Código:
jornadasResources.forEach {res -> val button = view.findViewById<Button>(res.viewId) button.setOnClickListener { miTexto.setText(res.labelId) requestJsonObject(res.jornada) } } 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!
Última edición por mocelet Día 22/10/18 a las 12:16:06. |
#17
|
||||
|
||||
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( Código:
requestJsonObject(res.jornada) 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. |
#18
|
||||
|
||||
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. |
Gracias de parte de: | ||
Estás aquí | ||||||
|
Herramientas | |