neitoo
@neitoo

Почему при нажатии на одну карточку в RecyclerView открывается другая карточка?

У меня есть RecyclerView в который добавляются карточки объявлений. Например на данный момент добавлены 3 (для удобства назовем их А,Б,В) карточки в виде ленты. На экране может помещаться одновременно полторы карточки, я нажимаю например на А - открывается Б, пролистав ленту нажимаю на Б - открывается В. Так вот, как это можно исправить? На карточку привязан onClick и через него я открываю новое активити, если это имеет значение. Эта проблема решается только если растянуть карточку на весь экран, тогда открывается нужное активити, но такое решение не то что мне нужно...
XML ленты:
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#373745"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/settingButton"
        android:layout_width="162dp"
        android:layout_height="57dp"
        android:layout_marginBottom="16dp"
        android:background="@drawable/button"
        android:backgroundTint="#6C63FF"
        android:fontFamily="@font/comfortaa"
        android:isScrollContainer="false"
        android:text="Фильтры"
        android:textColor="#ffffff"
        android:textSize="12sp"
        android:textStyle="bold"
        app:backgroundTint="@null"
        app:icon="@drawable/control_2"
        app:iconGravity="textStart"
        app:iconSize="30dp"
        app:iconTint="#FFFFFF"
        app:iconTintMode="src_atop"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        tools:ignore="SpeakableTextPresentCheck" />

    
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_menu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="32dp"
        android:scrollbars="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/constraintLayout"
        android:layout_width="0dp"
        android:layout_height="58dp"
        android:background="@drawable/rectangle_rounded_some"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.6"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <Button
            android:id="@+id/addAnAd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/button"
            android:backgroundTint="#6C63FF"
            android:fontFamily="@font/comfortaa"
            android:text="Подать объявление"
            android:textColor="#ffffff"
            android:textSize="12sp"

            android:textStyle="bold"
            app:backgroundTint="@null"
            app:icon="@drawable/home"
            app:iconSize="30dp"
            app:iconTint="#ffffff"
            app:iconTintMode="src_atop"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>



</androidx.constraintlayout.widget.ConstraintLayout>


XML шаблона карточки:
<com.google.android.material.card.MaterialCardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_marginTop="20dp"
    android:layout_marginStart="15dp"
    android:layout_marginEnd="15dp"
    app:cardElevation="15dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#3d3d4d"
        android:onClick="SelectInfoAd"
        android:paddingLeft="20dp"
        android:paddingTop="15dp"
        android:paddingRight="20dp"
        android:paddingBottom="10dp">

        <TextView
            android:id="@+id/costHouseAd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/comfortaa"
            android:text="20 000 Р"
            android:textColor="@color/white"
            android:textSize="20dp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/locationAd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/costHouseAd"
            android:fontFamily="@font/comfortaa"
            android:paddingBottom="6dp"
            android:text="location"
            android:textColor="#9EFFFFFF"
            android:textSize="15dp" />

        <ImageView
            android:id="@+id/house_image"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_below="@id/locationAd"
            android:background="@drawable/input_design"
            android:scaleType="centerCrop" />

        <TextView
            android:id="@+id/cropInfoAd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/house_image"
            android:fontFamily="@font/comfortaa"
            android:paddingTop="6dp"
            android:paddingBottom="20dp"
            android:text="info"
            android:textColor="@color/white"
            android:textSize="17dp" />

    </RelativeLayout>

</com.google.android.material.card.MaterialCardView>


Скриншот активити:
https://imgur.com/a/AjkZdX3

Код с добавлением карточки на экран и onClick:
override fun onStart() {
        super.onStart()


        val options = FirebaseRecyclerOptions.Builder<Houses>()
            .setQuery(HouseReference!!, Houses::class.java).build()

        val adapter: FirebaseRecyclerAdapter<Houses, HouseViewHolder> =
            object : FirebaseRecyclerAdapter<Houses, HouseViewHolder>(options) {
                @SuppressLint("SetTextI18n")
                override fun onBindViewHolder(@NotNull holder: HouseViewHolder, i: Int, @NotNull model: Houses) {
                    Log.v("adapter","222")
                    holder.txtCost.text = ("₽"+ model.getCostV())

                    holder.txtLocation.text = model.getLocationV()

                    val lengthInfo = holder.txtInfo.text.length
                    if (lengthInfo < 40) holder.txtInfo.text = model.getInfoV().substring(0,40).replaceRange(37,40,"...")
                    else holder.txtInfo.text = model.getInfoV()

                    Picasso.get().load(model.getImage()).into(holder.imageView)

                    cost = ("₽"+ model.getCostV())
                    location = (model.getLocationV())
                    room= (model.getRoomsV())
                    square = (model.getSquareV())
                    info = (model.getInfoV())
                    number = (model.getNumberV())
                    image = (model.getImage())
                }

                @NotNull
                override fun onCreateViewHolder(@NotNull parent: ViewGroup, viewType: Int): HouseViewHolder {
                    Log.v("viewholder","222")
                    val view = LayoutInflater.from(parent.context)
                        .inflate(R.layout.house_image_layout, parent, false)
                    return HouseViewHolder(view)
                }
            }
        recyclerView!!.adapter = adapter
        adapter.startListening()
    }


    fun SelectInfoAd(view: View){

        val IntentInfoAd = Intent(this@MainActivity, InfoMenuAd::class.java)
        IntentInfoAd.putExtra(Constant.COST, cost)
        IntentInfoAd.putExtra(Constant.LOCATION, location)
        IntentInfoAd.putExtra(Constant.ROOM, room)
        IntentInfoAd.putExtra(Constant.SQUARE, square)
        IntentInfoAd.putExtra(Constant.INFO, info)
        IntentInfoAd.putExtra(Constant.NUMBER, number)
        IntentInfoAd.putExtra(Constant.IMAGE, image)
        startActivity(IntentInfoAd)


    }
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
Jacen11
@Jacen11
долго искал обработчик нажатия

android:onClick="SelectInfoAd"

так не делают, сейчас принято нажатия по другому обрабатывать. Нужно лисенер вешать на вьюшку в коде. Во вьюхолдоре это у тебя будет

код очень вырвиглазный, почитай код стайлы например на джаву у гугла. На котлине так не пишут, но у тебя и джаве не соответствует. Посмотри какой хоткей автоформатирует код в студии
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы