Как сделать Android RecyclerView невидимым, нажав кнопку внутри себя? - PullRequest
0 голосов
/ 16 апреля 2019

Вот минимальный тестовый пример, который мне удалось сделать. RecyclerView show

Объединяется с RecyclerView и TextView, activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <TextView
            android:id="@+id/textViewBatteryInfo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hi, I'm watching you!"/>

    <android.support.v7.widget.RecyclerView
            android:id="@+id/my_rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>        
</LinearLayout>

С MainActivity.kt:

package kot.bignerd.recyclerview101

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

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

        val items = arrayListOf<String>()
        for (i in 10..50) {
            items.add("Here's the $i th")
        }

        my_rv.layoutManager = LinearLayoutManager(this)
        my_rv.adapter = MyListAdapter(items, this)

        //my_rv.visibility = View.GONE
    }
}

С очень простым адаптером (MyListAdapter):

package kot.bignerd.recyclerview101

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView

class MyListAdapter(val datas: List<String>, val context: Context) : RecyclerView.Adapter<MyListAdapter.InnerHolder>() {
    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): MyListAdapter.InnerHolder {
        var itemView: View = LayoutInflater.from(context).inflate(R.layout.item_rv, p0, false)
        return InnerHolder(itemView)
    }

    override fun getItemCount(): Int = datas.size

    class InnerHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemText: TextView = itemView.findViewById(R.id.item_tv)
    }

    override fun onBindViewHolder(p0: MyListAdapter.InnerHolder, p1: Int) {
        p0?.itemText?.text = datas[p1]
    }
}

R.layout.item_rv, указанное в адаптере (item_rv.xml):

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:id="@+id/item_cl"
        android:layout_height="wrap_content">

    <TextView
            android:id="@+id/item_tv"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:text="TestRV"
            android:textSize="18sp"
            android:gravity="center"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent" tools:layout_editor_absoluteY="16dp"
            app:layout_constraintHorizontal_bias="0.0"/>
    <Button
            android:text="Close"
            android:layout_width="86dp"
            android:layout_height="wrap_content" tools:layout_editor_absoluteY="16dp"
            android:id="@+id/button" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp"/>


</android.support.constraint.ConstraintLayout>

Мне было интересно, возможно, мы могли бы заставить RecyclerView исчезнуть, когда я нажму на одну из кнопок внутри него? Так же, как код my_rv.visibility = View.GONE в MainActivity.kt:

enter image description here

1 Ответ

1 голос
/ 16 апреля 2019

Ваш адаптер должен получить Listener как объект, чтобы реагировать на клики.Вот пример:

пакет kot.bignerd.recyclerview101

import android.content.Context import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.Viewimport android.view.ViewGroup import android.widget.TextView

class MyListAdapter(val datas: List<String>, val context: Context, val clickListener: ClickListener) : RecyclerView.Adapter<MyListAdapter.InnerHolder>() {

    public interface ClickListener {
        fun onItemClicked()
    }

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): MyListAdapter.InnerHolder {
        var itemView: View = LayoutInflater.from(context).inflate(R.layout.item_rv, p0, false)
        return InnerHolder(itemView)
    }

    override fun getItemCount(): Int = datas.size

    class InnerHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var itemText: TextView = itemView.findViewById(R.id.item_tv)
        var button: Button = itemView.findViewById(R.id. button)

        fun bindView(text: String, clickListener: ClickListener) {
            itemText.text = text
            button.setOnClickListner {
                clickListner.onItemClicked()
            }
        }
    }

    override fun onBindViewHolder(holder: MyListAdapter.InnerHolder, position: Int) {
        holder.bindView(datas[position], clickListener)
    }
}

Затем измените подпись действия следующим образом:

class MainActivity : AppCompatActivity(), ClickListener {

и реализуйте функцию следующим образом:

override fun onItemClicked() {
    my_rv.visibility = View.GONE
}

И последнее, но не менее важное: измените способ инициализации адаптера:

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