如何通过单击其内部的按钮使Android RecyclerView不可见?

时间:2019-04-16 11:31:23

标签: android kotlin android-recyclerview

这是我设法制作的最小测试用例。 RecyclerView show

它与RecyclerViewTextViewactivity_main.xml组合在一起,{p>

<?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 个答案:

答案 0 :(得分:1)

您的适配器需要接收Listener作为对象,以便对点击做出反应。 这是一个示例:

软件包kot.bignerd.recyclerview101

导入android.content.Context 导入android.support.v7.widget.RecyclerView 导入android.view.LayoutInflater 导入android.view.View 导入android.view.ViewGroup 导入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)