首页 > 解决方案 > 如何通过单击自身内部的按钮使 Android RecyclerView 不可见?

问题描述

这是我设法制作的最小测试用例。 回收站查看展示

它与一个RecyclerViewandTextView结合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

在此处输入图像描述

标签: androidkotlinandroid-recyclerview

解决方案


您的适配器需要接收 aListener作为对象才能对点击做出反应。这是一个例子:

包 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)

推荐阅读