Kotlin Retrofit Dynami c URL-запросы, как динамически изменять значение параметра запроса - PullRequest
0 голосов
/ 30 мая 2020

Используя Retrofit, я хочу отобразить информацию о выбранном элементе в recyclerview. (Этот вопрос основан на моем предыдущем вопросе о немного другом вопросе)

Итак, у меня есть эта конечная точка Endpoint: https://someURL.com/switching-product/stock?outcode=501

Каждый элемент в recyclerview (ProductStockOutletListFragment.kt ) имеет разные outcode. Вы можете увидеть это здесь

Я хочу, чтобы при щелчке на элементах в recyclerview ProductStockOutletListFragment.kt информация о выбранном элементе отображалась в другом фрагменте ProductListFragment.kt Вы можете см. здесь

(Допустим, я нажимаю элемент с outcode: «XXX» в ProductStockOutletListFragment.kt, затем я хочу показать информацию об элементе с помощью outcode: «XXX "in ProductListFragment.kt)

Значит, я также могу динамически изменять параметр запроса URL. Я должен получить значение параметра из элемента JSON, соответствующего элементу, который я щелкнул. В моем случае я все еще не понял, как это сделать.

Это JSON для ProductListFragment.kt:

enter image description here

Это адаптер, который я создал для ProductListFragment.kt:

ProductListAdapter.kt

class ProductListItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    private val productName: TextView = itemView.productName
    private val productPrice: TextView = itemView.productPrice
    private val productStockQuantity: TextView = itemView.productStockQuantity

    fun bind(
        product: ProductListPOJODataClassesDataItem,
        clickListener: ProductListOnItemClickListener
    ) {
        productName.text = product.stkProdcode
        productPrice.text = product.proSaleprice.toString()
        productStockQuantity.text = product.stkAllqty.toString()

        itemView.setOnClickListener {
            clickListener.onItemClicked(product)
        }
    }
}


class ProductListAdapter(private var productList: ProductListPOJODataClasses, private val itemClickListener: ProductListOnItemClickListener) : RecyclerView.Adapter<ProductListItemHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductListItemHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.product_list_item_layout, parent, false)
    return ProductListItemHolder(v)
}

    override fun getItemCount(): Int {
        return productList.data!!.size
    }

    override fun onBindViewHolder(holder: ProductListItemHolder, position: Int) {
        val product = productList.data?.get(position)
        if (product != null) {
            holder.bind(product, itemClickListener)
        }
    }

    fun getStkOutcode(product: ProductListPOJODataClassesDataItem) : String? {
        return  product.stkOutcode
    }
}


interface ProductListOnItemClickListener{
    fun onItemClicked(product: ProductListPOJODataClassesDataItem)
}

Это класс данных, который я использую:

data class ProductListPOJODataClasses(

    @field:SerializedName("data")
    val data: List<ProductListPOJODataClassesDataItem?>? = null,

    @field:SerializedName("error")
    val error: ProductListDataClassError? = null
)

data class ProductListDataClassError(

    @field:SerializedName("msg")
    val msg: String? = null,

    @field:SerializedName("code")
    val code: Int? = null,

    @field:SerializedName("status")
    val status: Boolean? = null
)

data class ProductListPOJODataClassesDataItem(
    @field:SerializedName("stk_prodcode")
    val stkProdcode: String? = null,

    @field:SerializedName("stk_allqty")
    val stkAllqty: Int? = null,

    @field:SerializedName("pro_saleprice")
    val proSaleprice: Int? = null,

    @field:SerializedName("skt_lastupdate")
    val sktLastupdate: String? = null,

    @field:SerializedName("stk_outcode")
    val stkOutcode: String? = null,

    @field:SerializedName("pro_name")
    val proName: String? = null
)

А это ProductListFragment.kt:

ProductListFragment.kt

class ProductListFragment : Fragment(), ProductListOnItemClickListener {

    lateinit var adapter: ProductListAdapter
    lateinit var binding: FragmentProductListBinding


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        (activity as AppCompatActivity).supportActionBar?.title = "Product List"

        // Binding object for this fragment and the layout
        binding = DataBindingUtil.inflate(inflater,
            R.layout.fragment_product_list, container, false)

        //Set layout manager of the recylerview
        binding.rvProductList.layoutManager = GridLayoutManager((activity as AppCompatActivity), 2)

        //set progress bar visible before and while data loaded
        binding.progressBar.visibility = View.VISIBLE

        //....You don't need any explanation for this.
        binding.foundProductQtyLayout.visibility = View.GONE

        //Retrieve data from server
        NetworkConfig().getProductListService()
            .getProducts() //How can i pass the parameter of the interface here ?
            .enqueue(object : Callback<ProductListPOJODataClasses> {

                override fun onFailure(call: Call<ProductListPOJODataClasses>, t: Throwable) {
                    Toast.makeText((activity as AppCompatActivity), t.localizedMessage, Toast.LENGTH_SHORT).show()
                    binding.progressBar.visibility = View.GONE
                }

                //Execute when data successfully retrieved
                override fun onResponse(
                    call: Call<ProductListPOJODataClasses>,
                    response: Response<ProductListPOJODataClasses>
                ) {
                    // Attach adapter to recyclerview
                    binding.rvProductList.adapter = response.body()?.let { ProductListAdapter(it, this@ProductListFragment) }

                    //set progress bar invisible after data loaded
                    binding.progressBar.visibility = View.GONE

                    //Render a toast after data loaded
                    if(activity != null){
                        Toast.makeText((activity as AppCompatActivity), "Data retrieved!", Toast.LENGTH_SHORT).show()
                    }else{
                        call.cancel()
                    }

                    //Show total number of found product
                    binding.foundProductQtyLayout.visibility = View.VISIBLE
                    binding.foundProductQty.text =
                        response.body()?.let { ProductListAdapter(it, this@ProductListFragment).itemCount.toString() }
                }

            })

        // Declare that this fragment has menu
        setHasOptionsMenu(true)

        return binding.root
    }

    override fun onItemClicked(product: ProductListPOJODataClassesDataItem) {
        // Some code
    }

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    // Some Code
   }
}

И это интерфейс для Retrofit, который я использую (из класса NetworkConfig.kt) :

//Endpoint: https://someURL.com/switching-product/stock?outcode=501

interface getProductList {
    @GET("stock")
    fun getProducts(@Query("outcode") stkOutcode: String): Call<ProductListPOJODataClasses>
}

Если что-то неясно, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...