【问题标题】:How to get data from class into intent如何从类中获取数据到意图
【发布时间】:2020-02-11 08:56:00
【问题描述】:

这是我的Post.kt 课程

data class Post ( val id: Int, val name: String?, val slug: String?,
                  val image: String?, val body: String?, val icon: String?,
                  val quote: String?, val video: String?, val created_at: String?,
                  val updated_at: String?
)

我需要在我的适配器意图中获取val slug,以便我可以将其发送到其他活动

Adapter

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var textView: TextView
        var aImage: ImageView

        init {
            textView = itemView.findViewById(R.id.text_name)
            aImage = itemView.findViewById(R.id.a_image)


            aImage.setOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View?) {
                    val intent = Intent(aImage.context, ArticlesDetail::class.java)
                    intent.putExtra("my_slug",text_slug.text.toString()) //here
                    aImage.context.startActivity(intent)

                    Log.e("Click", "you click on = $adapterPosition")

                }

            })

        }
    }

注意: text_slug.text.toString() 不存在,它只是一个占位符,我需要提供我的 val slug 而不是 text_slug。这就是我要找的。​​p>

有什么想法吗?

更新

我的适配器完整代码 + 包括下面的答案

class MyPostsRecyclerViewAdapter(val posts : ArrayList<Post>) : RecyclerView.Adapter<MyPostsRecyclerViewAdapter.ViewHolder>() {

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

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.textView.text = posts.get(position).name
        holder.bind(this.posts[position]) //added

        Glide.with(holder.aImage.context)
            .load(posts.get(position).image)
            .placeholder(R.drawable.placeholder2)
            .error(R.drawable.placeholder2)
            .fallback(R.drawable.placeholder2)
            .into(holder.aImage)
    }


    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var textView: TextView
        var aImage: ImageView

        init {
            textView = itemView.findViewById(R.id.text_name)
            aImage = itemView.findViewById(R.id.a_image)
        }
        // added
        fun bind(post:Post){
            textView.text = post.slug?:""
            aImage.setOnClickListener(object : View.OnClickListener {
                override fun onClick(v: View?) {
                    val intent = Intent(aImage.context, ArticlesDetail::class.java)
                    intent.putExtra("my_slug",post.slug?:"") // <<---
                    aImage.context.startActivity(intent)

                    Log.d("my slug is:", post.slug)

                    Log.e("Click", "you click on = $adapterPosition")

                }
            })
        }
    }

}

此代码的结果是应用程序崩溃(关闭并出现此错误 my.app.name has stopped)

更新 2

这是我的目标活动ArticlesDetail 代码。

说明 我上面的意图代码发送的 slug 来到这个活动,并根据该 slug 从 api 链接获取数据。

class ArticlesDetail : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration

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

        callAPIDemo()
    }

    // api code
    private fun callAPIDemo() {
        val mySlugValue: String = intent.getStringExtra("my_slug")
        // Instantiate the RequestQueue.
        val queue = Volley.newRequestQueue(this)
        val url = "https://example.com/api/articles/$mySlugValue"

        // Request a string response from the provided URL.
        val stringRequest = StringRequest(
            Request.Method.GET, url,
            Response.Listener<String> { response ->

                val list: ArrayList<Post> = ArrayList()
                getPosts(response,list)

                // here you will have the complete list of data in your "list" variable
                posts_list.layoutManager = LinearLayoutManager(this)
                Log.d("my list", list.toString())
                posts_list.adapter = ArticlesAdapter(list)
            },
            Response.ErrorListener { error ->
                //displaying the error in toast if occurrs
                Toast.makeText(applicationContext, error.message, Toast.LENGTH_SHORT)
                    .show()
            })
        // Add the request to the RequestQueue.
        queue.add(stringRequest)
    }


    fun getPosts(response: String,list:ArrayList<Post>) {

        var jsonObject = JSONObject(response)
        val jsonArray = jsonObject.getJSONArray("posts")

        for (i in 0 until jsonArray.length()) {
            val jsonObject1 = jsonArray.getJSONObject(i)
            var listingObject = Post(
                jsonObject1.getInt("id"),
                jsonObject1.getString("name"),
                jsonObject1.getString("slug"),
                jsonObject1.getString("image"),
                jsonObject1.getString("body"),
                jsonObject1.getString("icon"),
                jsonObject1.getString("quote"),
                jsonObject1.getString("video"),
                jsonObject1.getString("created_at"),
                jsonObject1.getString("updated_at")

            )
            list.add(listingObject)

        }
    }
}

目前,当我单击应该将我带入此活动以及 slug 值的图像时,我收到此错误

在 my.app.name.ui.ArticlesDetail.ArticlesDetail.getPosts(ArticlesDetail.kt:73)

第 73 行是这一行:

val jsonArray = jsonObject.getJSONArray("posts")

【问题讨论】:

  • 在 Post 类中实现 Parcelable 并将数据作为 intent.putExtra("user", Parcel OBJECT);并获取 getIntent().getParcelableExtra("")

标签: android kotlin android-intent


【解决方案1】:

您必须将setOnClickListener 移动到您从适配器接收数据的方法:

类似这样的:

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var textView: TextView
    var aImage: ImageView

    init {
        textView = itemView.findViewById(R.id.text_name)
        aImage = itemView.findViewById(R.id.a_image)
    }

    fun bind(post:Post){
        textView.text = post.slug?:""
        aImage.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
                val intent = Intent(aImage.context, ArticlesDetail::class.java)
                intent.putExtra("my_slug",post.slug?:"") // <<---
                aImage.context.startActivity(intent)

                Log.e("Click", "you click on = $adapterPosition")

            }
        })
    }
}

//适配器(基本)

class PostAdapter(val postList:List<Post>):RecyclerView.Adapter<ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.post_view, parent, false)
        return ViewHolder(view, listener)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(this.postList[position])
    }
}

//已更新基于用户帖子更新:

首先,我建议你有不同的文件。一个用于 Adapter,另一个用于 ViewHolder,注意,我重命名了。

另外,尝试将视图的所有信息绑定到它的方法中(在本例中为bind(post:View)

class MyPostsRecyclerViewAdapter(val posts : ArrayList<Post>) : RecyclerView.Adapter<PostViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
        val view: View = LayoutInflater.from(parent.context).inflate(R.layout.fragment_posts, parent, false)
        return PostViewHolder(view,parent.context)
    }

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

    override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
        holder.bind(this.posts[position]) //added
    }
}

class PostViewHolder(itemView: View,val context:Context) : RecyclerView.ViewHolder(itemView) {
    var textView: TextView
    var aImage: ImageView

    init {
        textView = itemView.findViewById(R.id.text_name)
        aImage = itemView.findViewById(R.id.a_image)
    }
    // added
    fun bind(post:Post){

        textView.text = post.name?:""

        Glide.with(context)
        .load(post.image?:"")
        .placeholder(R.drawable.placeholder2)
        .error(R.drawable.placeholder2)
        .fallback(R.drawable.placeholder2)
        .into(aImage)

        aImage.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
                val intent = Intent(context, ArticlesDetail::class.java)
                intent.putExtra("my_slug",post.slug?:"") // <<---
                context.startActivity(intent)

                Log.d("my slug is:", post.slug)

                //Log.e("Click", "you click on = $adapterPosition") --> for this log, you need to pass also the position

            }
        })
    }
}

【讨论】:

  • 我假设这个viewholder在recycler view中使用,所以记得在adapter中调用这个方法。 (修改了一点回答者)
  • 有一点要更新,setOnClickListener这个方法应该加到init的body里面,不要每次都在bind方法里设置。保留post 的实例(如lateinit var post 和绑定this.post = post
  • ok 第一个代码失败,让我试试你的更新。我会通知你结果
  • @mafortis 还尝试使用您的适配器更新您的帖子,以便我们了解/帮助您了解最新情况
  • 更新了我的问题请检查我是否做错了
【解决方案2】:

要在 ViewHolder 类中获取列表,您必须首先在类之前放置 inner 关键字,如下所示(基于您的旧方法)

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var textView: TextView
        var aImage: ImageView

        init {
            textView = itemView.findViewById(R.id.text_name)
            aImage = itemView.findViewById(R.id.a_image)



    aImage.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View?) {
            val intent = Intent(aImage.context, ArticlesDetail::class.java)
            intent.putExtra("my_slug",posts.get(adapterPosition).slug) // <<--- added here
            aImage.context.startActivity(intent)

            Log.e("Click", "you click on = $adapterPosition")

        }

    })
        }

【讨论】:

  • posts.get get part is red
  • 你放了inner关键字吗?
  • inner关键字是哪一部分?
  • inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
  • 我在第二次更新后解释了同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多