RecyclerView Кнопка-только элемент на клике - PullRequest
0 голосов
/ 18 октября 2019

Так что я делаю RecyclerView кнопок. И я не знаю, как / где написать onClick для кнопки. У меня есть JSONArray для передачи, и текст кнопки будет иметь cName.

Так что это мой item_unit.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:id="@+id/btn_unit"
        android:background="#000000"
        android:textColor="#ffffff"
        android:layout_margin="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Это мой ItemAdapter

//Here the stype is <CategoryItem> because this button will open
//new fragment to show the list of the items.
//So it's recyclerview item opens another recyclerview.

class CatAdapter(var btnList: ArrayList<CategoryItem>, var context: Context): RecyclerView.Adapter<ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        var v: View = LayoutInflater.from(context).inflate(R.layout.item_unit, parent, false)
        return ViewHolder(v)
    }


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


    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val data = btnList[position]
        holder.itemBtn.text = data.name
    }

}

class ViewHolder(view: View): RecyclerView.ViewHolder(view){
    var itemBtn = view.findViewById<Button>(R.id.item_btn)
}

Это представление переработчика фрагментарно. Мне нужно

class MainActFrag : Fragment() {

    var btnList = ArrayList<CategoryItem>()

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

        // Inflate the layout for this fragment
        var view =  inflater.inflate(R.layout.fragment_main_act, container, false)

        //Recycler view
        view.recyclerView.layoutManager = LinearLayoutManager(context)

       //I have the url 

        var stringRequest = StringRequest(Request.Method.GET, url,

            Response.Listener {

                var jsonObject = JSONObject(it)

                var jsonArrayCates =jsonObject.getJSONArray("category")

                for(i in 0 until jsonArrayCats.length()){

                    var btns =jsonArrayCates.getJSONObject(i)

                    var iD = btns.getString("id")
                    var name = btns.getString("name")
                    var des = btns.getString("description")

                    btnList.add(CategoryItem(cID, cName, cDes))
                }

                val adapter = ItemAdapter(btnList, view.context)
                recyclerView.adapter = adapter
            },
            Response.ErrorListener {}
        )

        Volley.newRequestQueue(view.context).add(stringRequest)

        return view
    }

}

Так что я не знаю, куда звонить каждому предмету на клике. Если это обычный элемент TextView, я могу это сделать, но, поскольку я решил создать элемент button, я не знаю, каким образом это можно сделать. Я думал, что это будет легко, потому что кнопка ... кликабельна по своей природе?

Спасибо!

1 Ответ

1 голос
/ 18 октября 2019

добавьте функцию привязки к классу ViewHolder, после чего вы можете поместить обработчик нажатия на каждую кнопку

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val data = btnList[position]
        holder.itemBtn.text = data.name
        holder.bindButtons()
    }
    class ViewHolder(view: View): RecyclerView.ViewHolder(view){
       var itemBtn = view.findViewById<Button>(R.id.item_btn)

       fun bindButtons()
          itemBtn.setOnClickListener{
            //do you click event stuff
          }
     }
...