【问题标题】:RecyclerView onClick in kotlinkotlin 中的 RecyclerView onClick
【发布时间】:2019-03-18 18:53:10
【问题描述】:

我是新的 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 类

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

我的 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)

   }
}

【问题讨论】:

  • 这个问题可能重复Click Listener
  • @BhoominNaik 谢谢你的帮助。我根据您的回答更新了上面的代码,我仍然有一个问题,当我使用if (pos == 0){ my_text_view.text = "Story number 1" my_imageview.setImageResource(R.drawable.pic1) } 时应用程序崩溃,但是当我删除这部分代码时它可以工作,但是新活动将具有相同的图片和文本所有位置,如何更改ChildrenStoryPreview Activity 中的文字和图片?
  • 最后我通过使用intent.putExtra("Key", pos) 将位置发送到另一个活动并在另一个活动中解决了这个问题,我使用了 if 语句来更改文本并且它起作用了。谢谢Bhoomin

标签: kotlin android-recyclerview


【解决方案1】:

将 Event Listener 传递给 Adapter 构造函数,也传递给 viewholder 以捕获视图持有者(项目)的点击。

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)

【讨论】:

  • 感谢您的帮助。我更新了上面的代码,我仍然有一个问题,当我使用if (pos == 0){ my_text_view.text = "Story number 1" my_imageview.setImageResource(R.drawable.pic1) } 时应用程序崩溃,但是当我删除这部分代码时它可以工作,但是新活动将具有所有位置的相同图片和文本,我怎么能更改 ChildrenStoryPreview Activity 中的文字和图片?
  • 当我点击我为他们制作的 RecyclerView 上的项目 1 或 2 时,它没有给我错误应用程序打开时没有任何错误;该应用程序停止并关闭。当我单击任何其他项目时,它会毫无问题地打开 CheldrenStoryPreview 活动
  • 当我尝试在my_text_view.text = "Story number 2" 行调试时,logcat 中显示的内容... 例外:主进程:com.mohamedali.coco,PID:21476 java.lang.IllegalStateException:my_text_view 不得null at com.mohamedali.coco.ChildrenStories.MainChildrenStories$onCreate$1.onClick(MainChildrenStories.kt:97) at com.mohamedali.coco.ChildrenStories.ChildrenStoriesAdapter$ViewHolder.onClick(ChildrenStoriesAdapter.kt:39) at android.view.View .performClick(View.java:4856) 在 android.view.View$PerformClick.run(View.java:19956) ...
  • 最后我通过使用intent.putExtra("Key", pos) 将位置发送到另一个活动并在我使用的另一个活动中解决了这个问题,如果声明并且它有效。谢谢纳雷克
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多