Home > Net >  How to bind two xml in one class in android?
How to bind two xml in one class in android?

Time:07-01

im noob in kotlin... I have MainActivity and a list view inside.

When an item is clicked in list view, I want to update a textView inside MainActivity.

However because data should be passed from ListView to MainActivity, I did something weird.

MainActivity.kt

data class Country(val imgRes:Int, val name:String)

class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding
    private val data = arrayListOf<Country>()

    val imgRes = intArrayOf()

    val data1 = arrayOf()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        for(i in imgRes.indices) {
            val country = Country(imgRes[i], data1[i])
            data.add(country)
        }

        val adapter = RecyclerAdapter(data, object:RecyclerAdapter.OnItemClickListener {
            override fun onItemClick(v: View, pos: Int) {
                binding.textView.text = (v as TextView).text
            }
        })
        binding.recycler1.adapter = adapter
        binding.recycler1.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
    }
}

ListView.kt

class RecyclerAdapter(private val dataSet:List<Country>, private val listener:OnItemClickListener) : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
    public interface OnItemClickListener {
        fun onItemClick(v:View, pos:Int)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = RowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(position)
    }

    inner class ViewHolder(val binding: RowBinding) : RecyclerView.ViewHolder(binding.root) {
        val rowImageView = binding.rowImageView
        val rowTextView = binding.rowTextView

        init {
            binding.root.setOnClickListener {
                listener.onItemClick(rowTextView, adapterPosition)
            }
        }

        fun bind(pos: Int) {
            with(binding) {
                rowImageView.setImageResource(dataSet[pos].imgRes)
                rowTextView.text = dataSet[pos].name
            }
        }
    }
}

I declared interface(OnItemClickListener) at ListView.kt and redefine it at MainActivity.kt. It works fine but is there any better way to do this?

CodePudding user response:

try this in your Adapter

var itemClickListener: ((position: Int, name: String) -> Unit)? = null

//bindviewholder

 itemClickListner.invoke(1,"anyvalue")

in activity

 adapter.itemClickListener = { 
            position, name ->
        Toast.makeText(requireContext(),"position is $position name is $name ",Toast.LENGTH_SHORT).show()
    }

CodePudding user response:

in adapter

private var mListener: OnItemClickListener,

 interface OnItemClickListener {
    fun onClick(position: Int, routerArray: ArrayList<Router>)
}


 binding.yourView.setOnClickListener {
            mListener.onClick(adapterPosition, routerArray)
        }

//in Activity

  override fun onClick(position: Int, yourArray: ArrayList<Model>) {
     binding.textView.text = yourArray[position].text
}
  • Related