RecyclerView onClick в kotlin - PullRequest
       1

RecyclerView onClick в kotlin

1 голос
/ 17 марта 2019

Я новый ученик Android, я пытаюсь создать RecyclerView , содержащий список (заголовки историй и изображения историй). Когда вы нажимаете на элемент в RecyclerView, он должен открыть новое действие под названием ChildrenStoriesPreview , содержащее ScrollView с ImageView для помещения в него Story Image и TextView , чтобы поместить в него текст истории. проблема в том, что я не знаю, как установить ocItemClickListener , чтобы знать, по какому элементу щелкают и как новое действие будет содержать информацию в зависимости от этого элемента? Не могли бы вы помочь мне?

вот мой Main.kt

class MainChildrenStories : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_children_stories)

    var childrenStoriesArraylist = ArrayList<ChildrenStoriesRecyclerView>()
    childrenStoriesArraylist.add(ChildrenStoriesRecyclerView("Story1", R.drawable.pic1))
    childrenStoriesArraylist.add(ChildrenStoriesRecyclerView("Story2", R.drawable.pic2))
    childrenStoriesArraylist.add(ChildrenStoriesRecyclerView("Story3", R.drawable.pic3))

    children_stories_recyclerview.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)

    val childrenStoriesAdapter = ChildrenStoriesAdapter(childrenStoriesArraylist)
    children_stories_recyclerview.adapter = childrenStoriesAdapter

childrenStoriesAdapter.setOnItemClickListener(object : ChildrenStoriesAdapter.ClickListener {
        override fun onClick(pos: Int, aView: View) {

    //The App Crash here
            if (pos == 0){
                my_text_view.text = "Story number 1"
                my_imageview.setImageResource(R.drawable.pic1)
            }else if (pos == 1){
                my_text_view.text = "Story number 2"
                my_imageview.setImageResource(R.drawable.pic2)
            }
            val intent = Intent(this@MainChildrenStories, ChildrenStoryPreview::class.java)
            startActivity(intent)
        }
    })

   }
}

MyRecyclerView Class

data class ChildrenStoriesRecyclerView(var mStoryName: String, var mStoryImage: Int)

Класс адаптера My RecyclerView

class ChildrenStoriesAdapter(var myArrayList: ArrayList<ChildrenStoriesRecyclerView>) :
RecyclerView.Adapter<ChildrenStoriesAdapter.ViewHolder>() {

lateinit var mClickListener: ClickListener

fun setOnItemClickListener(aClickListener: ClickListener) {
    mClickListener = aClickListener
}

override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
    val v = LayoutInflater.from(p0.context).inflate(R.layout.children_stories_list, p0, false)
    return ViewHolder(v)
}

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

override fun onBindViewHolder(p0: ViewHolder, p1: Int) {
    var infList = myArrayList[p1]
    p0.storyName.text = infList.mStoryName
    p0.storyImage.setImageResource(infList.mStoryImage)
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
    override fun onClick(v: View) {
        mClickListener.onClick(adapterPosition, v)
    }

    val storyName = itemView.findViewById(R.id.txtStoryName) as TextView
    val storyImage = itemView.findViewById(R.id.imageViewChildrenStories) as ImageView

    init {
        itemView.setOnClickListener(this)
    }
}

interface ClickListener {
    fun onClick(pos: Int, aView: View)
  }
}

Моя новая активность Показать подробности истории

class ChildrenStoryPreview : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_children_story_preview)

   }
}

1 Ответ

0 голосов
/ 17 марта 2019

Передайте прослушиватель событий в конструктор адаптера также в видоискатель, чтобы поймать щелчки держателя вида (элементов).

class ChildrenStoriesAdapter(var myArrayList: ArrayList<ChildrenStoriesRecyclerView>
                                     var clickListener:MyClickListener?) :
        RecyclerView.Adapter<ChildrenStoriesAdapter.ViewHolder>() {
        ...
        override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
              val v = LayoutInflater.from(p0.context).inflate(R.layout.children_stories_list, p0, false)
              return ViewHolder(v, clickListener)
        }
    ...

    inner class ViewHolder(itemView: View, clickListener:MyClickListener?) : 
      RecyclerView.ViewHolder(itemView) {
    itemView.setOnClickListener { clickListener?.myClickedFun(...) }
    ...

   class ChildrenStoryPreview : AppCompatActivity(), MyClickListener {
         override fun onCreate(savedInstanceState: Bundle?) {
             super.onCreate(savedInstanceState)
             setContentView(R.layout.activity_children_story_preview)
         }
         override fun myClickedFun(...) {
         ...
        }
    }

Позднее инициализирующий адаптер, например ..

 val childrenStoriesAdapter = ChildrenStoriesAdapter(childrenStoriesArraylist, this)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...