【问题标题】:Retrofit pass String to url改造将字符串传递给 url
【发布时间】:2019-10-30 04:28:25
【问题描述】:

如何通过按按钮将变量 day 传递给 apiInterface 类?

片段 FragJornadas,我想从哪里将变量传递给接口中的@Get?

    class FragJornadas : Fragment() {

var jornada =  "1"
var dataList = ArrayList<TodasModel>()
lateinit var recyclerView: RecyclerView

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.jornadas_list, container, false)

    val miTexto: TextView = view.findViewById(R.id.tv_Jornadas)
    miTexto.text = (getString(R.string.num_jornada))

    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.num_jornada) + " " + buttonText
            jornada = buttonText

            getData(jornada)
        }
    }

    return view
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val progressBar: ProgressBar = this.progressBar1

    recyclerView = view.findViewById(R.id.recycler_view)
    recyclerView.adapter= TodasAdapter(dataList,activity!!)
    recyclerView.layoutManager=LinearLayoutManager(activity!!,LinearLayoutManager.VERTICAL,false)

    Thread(Runnable {
        activity!!.runOnUiThread {
            progressBar.visibility = View.VISIBLE
        }

        try {
            var i = 0
            while(i < Int.MAX_VALUE){
                i++
            }
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }

        activity!!.runOnUiThread {
            progressBar.visibility = View.GONE
        }
    }).start()
    getData(jornada)
}

private fun getData(jornada: String) {
    val call: Call<List<TodasModel>> = ApiFederacion.getClient.getTodasJuvenil(jornada)
    call.enqueue(object : Callback<List<TodasModel>> {

        override fun onResponse(call: Call<List<TodasModel>>?, response: Response<List<TodasModel>>?) {
            dataList.addAll(response!!.body()!!)
            recyclerView.adapter!!.notifyDataSetChanged()
        }

        override fun onFailure(call: Call<List<TodasModel>>?, t: Throwable?) {
            //progerssProgressDialog.dismiss()
        }
    })
}

TodasAdapter

class TodasAdapter(private var actList: List<TodasModel>, private val context: Context) : RecyclerView.Adapter<TodasAdapter.ViewHolder>() {


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

override fun getItemCount(): Int {
   return actList.size
}

@SuppressLint("SetTextI18n", "SimpleDateFormat")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val dataModel= actList.get(position)

    holder.itemView.setOnClickListener(){

        Toast.makeText(context, dataModel.nomLocal, Toast.LENGTH_LONG).show()
    }

    val parser = SimpleDateFormat("dd/MM/yyyy") //Formato de fecha obtenida
    val formatter = SimpleDateFormat("EE dd 'de' MMMM 'del 'yyyy \n" + "'  a las '") //Formato a mostrar
    val output = formatter.format(parser.parse(dataModel.fecha + "/2019"))

    holder.tv_Fecha.text = output + dataModel.hora
    //holder.tv_Fecha.text = dataModel.fecha + "\n" + dataModel.hora
    holder.tv_NomLocal.text = dataModel.nomLocal
    holder.tv_ResultadoL.text = dataModel.resulLocal
    holder.tv_Estado.text = " - " + dataModel.estadoPartido + " - "
    holder.tv_ResultadoV.text = dataModel.resulVisitante
    holder.tv_NomVisitante.text = dataModel.nomVisitante

    Picasso.get()
        .load("https://ffcv.es/ncompeticiones/" + dataModel.escudoLocal)
        .fit()
        //.resize(150, 150)
        .into(holder.imageEscLocal)

    Picasso.get()
        .load("https://ffcv.es/ncompeticiones/" + dataModel.escudoVisitante)
        .fit()
        .into(holder.imageEscVisi)
}


class ViewHolder(itemLayoutView: View) : RecyclerView.ViewHolder(itemLayoutView) {
    var tv_Fecha:TextView
    var tv_NomLocal:TextView
    var tv_ResultadoL:TextView
    var tv_Estado:TextView
    var tv_ResultadoV:TextView
    var tv_NomVisitante:TextView
    var imageEscLocal: ImageView
    var imageEscVisi: ImageView

    init {
        tv_Fecha = itemLayoutView.findViewById(R.id.tv_Fecha)
        tv_NomLocal = itemLayoutView.findViewById(R.id.tv_Equipo_Local)
        tv_ResultadoL = itemLayoutView.findViewById(R.id.tv_Result_Local)
        tv_Estado = itemLayoutView.findViewById(R.id.tv_Estado)
        tv_ResultadoV = itemLayoutView.findViewById(R.id.tv_Result_Visitante)
        tv_NomVisitante = itemLayoutView.findViewById(R.id.tv_Equipo_Visitante)

        imageEscLocal = itemLayoutView.findViewById(R.id.iv_Local) as ImageView
        imageEscVisi = itemLayoutView.findViewById(R.id.iv_Visi) as ImageView
    }
}

}

以及接收它的 ApiInterface 类。作为我想要获取的网址是:

@GET("server.php?action=getResultados&cmp=328{jor}tmp=2018/2019") fun
getTodasJuvenil(
    @Path("jor") jornada: String ): Call<List<TodasModel>>

我要获取的网址是:

“server.php?action=getResultados&cmp=328&jor=1&tmp=2018/2019”

这是错误:

java.lang.IllegalArgumentException:URL 查询字符串 "action=getResultados&cmp=328{jor}&tmp=2018/2019" 不能有 替换块。对于动态查询参数

在 com.myapplication.Jornadas.FragJornadas.getData(FragJornadas.kt:91) 在 com.myapplication.Jornadas.FragJornadas.onViewCreated(FragJornadas.kt:87)

【问题讨论】:

    标签: android kotlin retrofit2


    【解决方案1】:

    使用@Path 是在告诉retrofit 替换url 路径中的该变量,但您希望在查询字符串中。路径是域之后和查询字符串之前的位 - 在您的情况下是 server.php 并且可能是之前的一些位,如果没有看到完整的 url,我不能说。

    要向查询字符串添加参数,您想使用@Query,并且您不想在@GET 注释的查询字符串中指定它。因此,您可以将内容更改为:

    @GET("server.php?action=getResultados&cmp=328&tmp=2018/2019") fun
    getTodasJuvenil(
      @Query("jor") jornada: String ): Call<List<TodasModel>>)
    

    您已从查询字符串中删除了{jor},并将@Path 替换为@Query

    现在,改造应该添加一个带有所需jornada 的查询参数。

    【讨论】:

    • 很完美,但是当我点击另一个按钮时,为什么它不刷新reciclerView?
    • 不确定。你能添加适配器代码吗?也许那里缺少一些东西。
    • 在帖子 1 中添加适配器
    • 看不出有什么问题。您确定通话不是以onFailure 结尾吗?另外,我会仔细检查您是否真的在检索任何数据。在 onResponse 内部,当 http 调用失败时,您仍然会收到错误消息。这由response.isSuccessful() 方法指示,当您没有获得状态 2XX 时会发生这种情况。在这种情况下,response.body() 将为 null,错误正文将在 response.errorBody() 中。
    【解决方案2】:

    @Fred感谢您的回答,我的错误不是上一个,我没有删除列表,它是在最后添加的,解决方案是:

    dataList.clear()
    
    override fun onResponse(call: Call<List<TodasModel>>?, response: Response<List<TodasModel>>?) {
                    dataList.clear()
                    dataList.addAll(response!!.body()!!)
                    recyclerView.adapter!!.notifyDataSetChanged()
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多