Как получить данные из класса в намерения - PullRequest
0 голосов
/ 11 февраля 2020

Это мой 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. Это то, что я ищу.

Есть идеи?

Обновление

Полный код моего адаптера + приведенный ниже ответ

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 код.

Объяснение Плагин, который я отправил с помощью моего кода намерения выше, приходит к этому действию и получает данные по 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)

        }
    }
}

в настоящее время, когда я нажимаю на изображение который должен был привести меня к этой деятельности вместе со значением слага 1047 *

Строка 73 - это строка:

val jsonArray = jsonObject.getJSONArray("posts")

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Для получения списка в вашем классе 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")

        }

    })
        }
1 голос
/ 11 февраля 2020

Вы должны переместить 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")

            }
        })
    }
}

// ADAPTER (Basi c )

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

            }
        })
    }
}
...