Слушатели Onclick для представлений в строке представления переработчика - PullRequest
0 голосов
/ 05 марта 2020

У меня есть вид переработчика, составленный для строк. В каждом ряду есть кнопка и изображение. Я хочу добавить слушателя onClick для каждого изображения. Как я могу сделать это, используя android и kotlin? Я знаю, как добавить прослушиватель onClick для строки, но не для элементов строки?

Вот мой код

import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import com.sumizeit.sumizeit.*
import kotlinx.android.synthetic.main.activity_home.*

class HomeAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private var context: Context
    private var list: ArrayList<HomeRow>

    constructor(context: Context, list: ArrayList<HomeRow>){
        this.context = context
        this.list = list
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val vHolder = holder as YourViewHolder
        Picasso.get().load(list[position].image1).into(vHolder.txtImage1);
        Picasso.get().load(list[position].image2).into(vHolder.txtImage2);
        Picasso.get().load(list[position].image3).into(vHolder.txtImage3);
        Picasso.get().load(list[position].image4).into(vHolder.txtImage4);
        Picasso.get().load(list[position].image5).into(vHolder.txtImage5);

        vHolder.txtImage1.setOnClickListener {
            //TODO something..
            Intent(context, BookDetailActivity::class.java).apply {
                putExtra("bookId", list[position].id1)
            }
        }

        vHolder.txtImage2.setOnClickListener {
            //TODO something..
            Intent(context, BookDetailActivity::class.java).apply {
                putExtra("bookId", list[position].id2)
            }
        }
    }

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

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

    var onItemClick: ((pos: Int, view: View) -> Unit)? = null
    inner class YourViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener {
        override fun onClick(v: View) {
            onItemClick?.invoke(adapterPosition, v)
        }
        val txtImage1 = itemView.findViewById<ImageView>(R.id.imageView1)
        val txtImage2 = itemView.findViewById<ImageView>(R.id.imageView2)
        val txtImage3 = itemView.findViewById<ImageView>(R.id.imageView3)
        val txtImage4 = itemView.findViewById<ImageView>(R.id.imageView4)
        val txtImage5 = itemView.findViewById<ImageView>(R.id.imageView5)

        init {
            itemView.setOnClickListener(this)
        }
    }
}

в Activity

       var adp = HomeAdapter(this, listHomeRow);
       rv.adapter = adp

Ответы [ 4 ]

1 голос
/ 05 марта 2020

измените свой код

        override fun onClick(v: View) {
            onItemClick?.invoke(adapterPosition, v)
        }
        val txtImage1 = itemView.findViewById<ImageView>(R.id.imageView1)
        val txtImage2 = itemView.findViewById<ImageView>(R.id.imageView2)
        val txtImage3 = itemView.findViewById<ImageView>(R.id.imageView3)
        val txtImage4 = itemView.findViewById<ImageView>(R.id.imageView4)
        val txtImage5 = itemView.findViewById<ImageView>(R.id.imageView5)

        init {
            itemView.setOnClickListener(this)
        }
    }

на

inner class YourViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener {
        override fun onClick(v: View) {
            onItemClick?.invoke(adapterPosition, v)
        }
        val txtImage1 = itemView.findViewById<ImageView>(R.id.imageView1)
        val txtImage2 = itemView.findViewById<ImageView>(R.id.imageView2)
        val txtImage3 = itemView.findViewById<ImageView>(R.id.imageView3)
        val txtImage4 = itemView.findViewById<ImageView>(R.id.imageView4)
        val txtImage5 = itemView.findViewById<ImageView>(R.id.imageView5)

        init {
            txtImage1.setOnClickListener{
                Intent(context, BookDetailActivity::class.java).apply {
                putExtra("bookId", list[layoutPosition].id1)
                context.startActivity(this)
                }
            }
            txtImage2.setOnClickListener{
                Intent(context, BookDetailActivity::class.java).apply {
                putExtra("bookId", list[layoutPosition].id2)
                context.startActivity(this)
                }
            }
        }
    }

и удалите clickListener в вашем методе bindViewHolder (). попробуйте это, братан.

1 голос
/ 05 марта 2020

В ожидании вашего адаптера я сделал пример кода.

class CategoryAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private var context: Context
    private var list: ArrayList<YourItem>

    constructor(context: Context, list: ArrayList<YourItem>){
        this.context = context
        this.list = list
    }


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

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

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val cameraViewHolder = holder as YourViewHolder

        cameraViewHolder.imageView.setOnClickListener {
            //TODO something..
            Intent(context, MainActivity::class.java).apply {
                putExtra("category", list[position].name)
            }
        }
    }

    internal class YourViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val imageView: ImageView = itemView.your_image
    }
}

Новый, Попробуйте это

import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import com.sumizeit.sumizeit.*
import kotlinx.android.synthetic.main.activity_home.*
import kotlinx.android.synthetic.main.home_row.*

class HomeAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private var context: Context
    private var list: ArrayList<HomeRow>

    constructor(context: Context, list: ArrayList<HomeRow>){
        this.context = context
        this.list = list
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val vHolder = holder as YourViewHolder

        with(Picasso.get()){
            load(list[position].image1).into(vHolder.txtImage1)
            load(list[position].image2).into(vHolder.txtImage2)
            load(list[position].image3).into(vHolder.txtImage3)
            load(list[position].image4).into(vHolder.txtImage4)
            load(list[position].image5).into(vHolder.txtImage5)
        }

        vHolder.txtImage1.setOnClickListener {
            //TODO something..
            Intent(context, BookDetailActivity::class.java).apply {
                putExtra("bookId", list[position].id1)
                context.startActivity(this)
            }
        }

        vHolder.txtImage2.setOnClickListener {
            //TODO something..
            Intent(context, BookDetailActivity::class.java).apply {
                putExtra("bookId", list[position].id2)
                context.startActivity(this)
            }
        }
    }

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

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

    inner class YourViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

        val txtImage1 = itemView.imageView1
        val txtImage2 = itemView.imageView2
        val txtImage3 = itemView.imageView3
        val txtImage4 = itemView.imageView4
        val txtImage5 = itemView.imageView5

    }
}
0 голосов
/ 05 марта 2020

Создание настраиваемого представления для представления переработчика:

<androidx.cardview.widget.CardView
    android:id="@+id/info_card_view"
    app:cardCornerRadius="@dimen/dimen_card_radius"
    app:cardElevation="@dimen/dimen_card_elevation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/dimen_common_margin">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/list_item_constraintlayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="@dimen/dimen_card_padding">

       ...

        <!--Image corresponding to info-->
        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/image_pexel"
            android:layout_width="@dimen/dimen_0"
            android:layout_height="wrap_content"
            android:contentDescription="@null"
            android:layout_margin="@dimen/dimen_common_margin"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:imageUrl="@{pexelPhoto.src.medium}"
            app:layout_constraintEnd_toEndOf="parent"
            tools:srcCompat="@drawable/ic_launcher_foreground"/>

       ...

    </androidx.constraintlayout.widget.ConstraintLayout>

Создание настраиваемой области просмотра, в которой будет прослушиватель щелчка для изображения в строке просмотра переработчика:

class PhotosViewHolder(private val viewBinding: ViewDataBinding) :
    RecyclerView.ViewHolder(viewBinding.root) {
    fun bind(data: Any, listener: OnItemClickListener) {
        viewBinding.setVariable(BR.pexelPhoto, data)
        (viewBinding.root.findViewById(R.id.image_pexel) as ImageView).setOnClickListener { _ ->
            listener.onThumbnailClick(data as PexelPhoto)
        }
        viewBinding.executePendingBindings()
    }
}

Вы можете проверить полный источник здесь для справки: https://github.com/spartan-1/PexelsApp

0 голосов
/ 05 марта 2020

Внутри адаптера, к которому привязан ImageView. Просто используйте эту ссылку для установки onClickListener. Вы, вероятно, делаете это внутри метода onBindViewHolder или внутри ViewHolder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...