【问题标题】:changing visibility of a recyclerview item changes other item's visibility更改 recyclerview 项目的可见性会更改其他项目的可见性
【发布时间】:2018-12-09 16:59:17
【问题描述】:

我有一个带有适配器的 recyclerView... recyclerview 有带有类似按钮的项目。当我单击(喜欢)按钮时,(不喜欢)应该变得不可见,反之亦然..一切正常,但是当我在一个项目中单击(喜欢)时,其他项目中的(不喜欢)也变得不可见,就像我在点击一样其他视图中的相同按钮 我已经尝试过这个答案,但它不起作用Android: Changing visibility of a view in recyclerView 这是适配器代码:

    package com.example.user.myapplication;

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.opengl.Visibility
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.*
import android.widget.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import kotlinx.android.synthetic.main.item.view.*
import kotlinx.android.synthetic.main.itemm.view.*
import java.io.BufferedReader
import java.io.File
import java.io.FileReader

/**
 * Created by Ahmed on 10/14/2018.
 */

class ItemmAdapter(private val mItems: Array<File>,private val activity:Activity) : RecyclerView.Adapter<ItemmAdapter.ItemViewHolder>() {

    lateinit var parent:ViewGroup

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.itemm, parent, false)
        this.parent=parent
        return ItemViewHolder(view)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {

        val item = mItems[position]
        holder.itemView.layoutParams=RecyclerView.LayoutParams(parent.context.resources.displayMetrics.widthPixels/2,RecyclerView.LayoutParams.MATCH_PARENT)



        //holder.itemView.findViewById<ImageView>(R.id.image).setImageResource(R.drawable.icons8_cycling_104)
        //holder.itemView.findViewById<TextView>(R.id.description).text="abcdefghijklmnopqrstuvwxyzضصثقفغعهخحجدطكمنتالبيسشذئءؤرلاىة"
        //holder.itemView.findViewById<TextView>(R.id.price).text="10000$"
        holder.like.setOnClickListener{
            holder.like.visibility=View.GONE
            holder.unlike.visibility=View.VISIBLE
        }
        holder.unlike.setOnClickListener{
            holder.unlike.visibility=View.GONE
            holder.like.visibility=View.VISIBLE
        }
        holder.shopping.setOnClickListener{
            holder.shopping.visibility=View.GONE
            holder.notshopping.visibility=View.VISIBLE
        }
        holder.notshopping.setOnClickListener{
            holder.notshopping.visibility=View.GONE
            holder.shopping.visibility=View.VISIBLE
        }
    }

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

    inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val like=itemView.findViewById<ImageView>(R.id.like)
        val unlike=itemView.findViewById<ImageView>(R.id.unlike)
        val shopping=itemView.findViewById<ImageView>(R.id.shopping)
        val notshopping=itemView.findViewById<ImageView>(R.id.notShopping)


    }

}

请帮帮我

【问题讨论】:

  • 点击购物而不是购物怎么办?
  • @Dr4ketheb4dass 在点击购物/不购物时也会出现同样的问题
  • 不,我不这么认为@Dr4ketheb4dass

标签: android kotlin android-recyclerview


【解决方案1】:

仅在每个项目中使用绑定设置项目内容,并将侦听器从绑定方法移动到持有者类

inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var liked = false
        var shopped = false
        val like=itemView.findViewById<ImageView>(R.id.like)
        val unlike=itemView.findViewById<ImageView>(R.id.unlike)
        val shopping=itemView.findViewById<ImageView>(R.id.shopping)
        val notshopping=itemView.findViewById<ImageView>(R.id.notShopping)

        init{

           like?.setOnClickListener{
                 liked = true
                 like.visibility=View.GONE
                 unlike.visibility=View.VISIBLE
           }
           unlike?.setOnClickListener{
                  liked = false
                  unlike.visibility=View.GONE
                  like.visibility=View.VISIBLE
           }
           shopping?.setOnClickListener{
                  shopped = true 
                  shopping.visibility=View.GONE
                  notshopping.visibility=View.VISIBLE
           }
           notshopping?.setOnClickListener{
                  shopped = false
                  notshopping.visibility=View.GONE
                  shopping.visibility=View.VISIBLE
           }
       }

       fun bind(){// call this from onBind method of adapter
         if(liked) like?.performClick() else unlike?.performClick()
         if(shopped) shopping?.performClick() else notshopping?.performClick()
       }

    }

【讨论】:

    【解决方案2】:

    发生这种情况是因为它是一个回收器视图(因此视图会在您滚动时被回收,并且类似或不一样的可见性会停留在那里。

    修改您的项目对象以包含布尔值 isLiked 并在 onClick 上将其设置为 true 或 false:

    holder.like.setOnClickListener{
                item.setIsLiked(true);
            }
    
    holder.unlike.setOnClickListener{
                item.setIsLiked(false);
            }
    

    并基于此设置视图可见性:

    holder.like.visibility=item.getIsLiked() ? View.VISIBLE : View.GONE; 
    holder.unlike.visibility=item.getIsLiked() ? View.GONE : View.VISIBLE;
    

    注意:如果您使用自动生成的 getter 和 setter,setIsLiked(boolean like) 和 getIsLiked() 可能是不同的名称;

    购物不购物也一样

    【讨论】:

    • 使用正确的 Kotlin 设置和获取方式(我不认为 .set 和 .get 是正确的方式,我猜你应该使用 .isLiked=true 和 .isLiked)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多