Kotlin: получить значение представления списка элементов, по которому щелкнули (Fragment + Adapter) - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь получить значение клика из моего списка в виде снаружи ListView. Когда я нажимаю на свой элемент, я хочу заполнить textView внутри моего фрагмента.

Во фрагменте у меня есть searchView и ListView.

это мой адаптер:

class ListAdapterHoraire (context: Context, resource: Int, list: ArrayList<String>, private val arguments: Bundle?, private val forScol : Boolean) : ArrayAdapter<String>(context, resource, list) {

    private val TAG = ListAdapterCustom::class.java.simpleName
    var nameArret: String = ""

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = super.getView(position, convertView, parent)

        val arret = view.findViewById<TextView>(R.id.arret)
        val receivedBundle = arguments    
        arret.setOnClickListener {
            val fragment = HorairePassage()
            fragment.arguments = receivedBundle
            nameArret = arret.text.toString()
            Log.i(TAG, "${arret.text} clicked")
            getArretCode(arret.text.toString(), fragment) //récupération du code arret + changement de fragment (en cascade)
        }

        if (position % 2 == 1) {
            view.setBackgroundResource(R.color.colorWhite)
        } else {
            view.setBackgroundResource(R.color.grayBackground)
        }



        return view
    }

Часть фрагмента:

search.setOnQueryTextListener(object : android.support.v7.widget.SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(newText: String): Boolean {
                return false
            }

            override fun onQueryTextChange(newText: String): Boolean {
                if(newText.length > 3){
                    loadingArretSearch.visibility = View.VISIBLE
                    getListeArrets(view, newText.trim(), resultArgument)
                    adapter = ListAdapterHoraire(view.context, R.layout.list_adapter, lignes, resultArgument, false)
                    listSearchView.adapter = adapter
                    adapter.filter.filter(newText.trim())
                    if(newText.trim() != ""){
                        listSearchView.visibility = View.VISIBLE
                    }else{
                        listSearchView.visibility = View.GONE
                    }
                }else{
                    lignes.clear()
                    loadingArretSearch.visibility = View.GONE
                    listSearchView.visibility = View.GONE
                }
                return false

            }

        })

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Попробуйте передать функцию в качестве параметра в конструкторе и вызвать ее при вызове onClickListener:

class ListAdapterHoraire (context: Context, resource: Int, list: ArrayList<String>, private val arguments: Bundle?, private val forScol : Boolean,
 private val onItemClicked: (text: String) -> Unit) : ArrayAdapter<String>(context, resource, list) {       
         ...


         arret.setOnClickListener { onItemClicked(arret.text.toString()) }

         ...

        }

Итак, в вашем фрагменте обновите экземпляр адаптера

adapter = ListAdapterHoraire(view.context, R.layout.list_adapter, 
             lignes, resultArgument, false,
             { text -> Log.i("TAG", text) /** Do something here **/ })
 ...
0 голосов
/ 11 января 2019

для таких случаев -> попробуйте передать обратный вызов в адаптер, и вы сможете использовать любой метод из вашей деятельности, а затем вы можете делать то, что вы хотите от своей деятельности.

class MyRecyclerViewAdapter(params , val itemClick: (Int) -> Unit): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    internal inner class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        ...
        itemView.setOnClickListener( {itemClick(layoutPosition)} )
    }
}

In your fragment or Activity 

val myAdapter = MyRecyclerViewAdapter(params) { position ->
    // do something
} 

-> в вашем случае

ListAdapterHoraire(view.context, R.layout.list_adapter, lignes, resultArgument, false){value->
  // do something
}  

class ListAdapterHoraire (context: Context, resource: Int, list: ArrayList<String>, private val arguments: Bundle?, private val forScol : Boolean,onItemClicked: (text: String) -> Unit) : ArrayAdapter<String>(context, resource, list) {

         ...


         arret.setOnClickListener { onItemClicked(arret.text.toString()) }

         ...

        }
...