Используя 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
:
Это адаптер, который я создал для 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>
}
Если что-то неясно, дайте мне знать.