首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在回收视图的每个元素中更改文本视图的可见性?

如何在回收视图的每个元素中更改文本视图的可见性?
EN

Stack Overflow用户
提问于 2021-07-27 17:46:17
回答 1查看 337关注 0票数 0

我有一个数组列表(称为Itemlist)的所有回收视图元素。在每个元素中有两个文本视图-一个德语和英语单词。只显示其中一个(因为它们重叠)。当我单击元素时,它会显示另一种语言(例如:德语单词设置为gone,英语单词现在可见)。

现在,我想要一个函数,将所有英语文本视图(在每个元素中)设置为gone,将德语设置为visible。我的问题是-我不知道如何到达这个数组中的所有元素并检查文本视图的可见性。在我的例子中,它只重置第一个单词。

为了更好的理解

以下是代码:

代码语言:javascript
复制
fun reset_to_EN() {

    ItemList.forEach { test_if_german() }
}

代码语言:javascript
复制
fun reset_to_EN2() {

    for (item in ItemList) {
        test_if_german()
    }
}

检查能见度

代码语言:javascript
复制
fun test_if_german(){

    if (text_view_de.visibility == View.VISIBLE) {
        text_view_en.visibility = View.VISIBLE
        text_view_de.visibility = View.GONE
    }
    adapter.notifyDataSetChanged()
}

如果你能,请给我一个代码示例,以更好地理解。

感谢所有想帮忙的人。

如果需要,下面是适配器和mainActivity的全部代码:

代码语言:javascript
复制
class Adapter(
        val c: Context,
        private val ArrList: ArrayList<Item>):
        RecyclerView.Adapter<Adapter.ViewHolder>()
{

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)

        return ViewHolder(inflater)
    }

    override fun getItemCount() = ArrList.size

    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v), View.OnClickListener {

        var textViewDe: TextView = v.text_view_de
        var textViewEn: TextView = v.text_view_en
        private var menueImage: Button

        init {
            v.setOnClickListener(this)
            textViewDe = v.findViewById(R.id.text_view_de)
            textViewEn = v.findViewById(R.id.text_view_en)
            menueImage = v.findViewById(R.id.menu_button)
            menueImage.setOnClickListener { popupMenu(it) }
        }

        private fun popupMenu(v:View) {
            val drop = PopupMenu(c, v)
            val position = ArrList[adapterPosition]

            drop.inflate(R.menu.drop_menu) 
            drop.setOnMenuItemClickListener {
                when(it.itemId){
                    R.id.edit_menu->{
                        val v2 = LayoutInflater.from(c).inflate(R.layout.add_item_layout,null) 
                        val DE = v2.findViewById<EditText>(R.id.editText)        
                        val EN = v2.findViewById<EditText>(R.id.editText2)
                        AlertDialog.Builder(c)                               
                            .setView(v2)                                     
                            .setPositiveButton("Ok"){
                                    dialog,_->
                                position.Englisch = DE.text.toString()
                                position.Deutsch = EN.text.toString()
                                notifyDataSetChanged()
                                //Toast.makeText(c,"User Information is Edited",Toast.LENGTH_SHORT).show()
                                dialog.dismiss()

                            }
                            .setNegativeButton("Cancel"){
                                    dialog,_->
                                dialog.dismiss()

                            }
                            .create()
                            .show()
                        true
                    }
                    R.id.delete_menu-> {
                                ArrList.removeAt(adapterPosition)
                                notifyDataSetChanged()
                                //Toast.makeText(c,"entfernt",Toast.LENGTH_SHORT).show()

                        true
                    }
                    else -> true
                }

            }
            drop.show()
            val popup = PopupMenu::class.java.getDeclaredField("mPopup")
            popup.isAccessible = true
            val menu = popup.get(drop)
            menu.javaClass.getDeclaredMethod("setForceShowIcon",Boolean::class.java)
                    .invoke(menu,true)


        }

        override fun onClick(p0: View?) {

            if (textViewDe.visibility == View.VISIBLE) {
                textViewDe.visibility = View.GONE
                textViewEn.visibility = View.VISIBLE
            } else {
                textViewDe.visibility = View.VISIBLE
                textViewEn.visibility = View.GONE
            }
        }
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val currentItem = ArrList[position]
        holder.textViewDe.text = currentItem.Deutsch
        holder.textViewEn.text = currentItem.Englisch
    }

和MainActivity:

代码语言:javascript
复制
class MainActivity : AppCompatActivity() {

//DEFINITION
    private lateinit var addButton: FloatingActionButton
    private lateinit var ItemList: ArrayList<Item>
    private lateinit var recy: RecyclerView
    private lateinit var adapter: Adapter

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

//FINDVIEWBYID
        addButton = findViewById(R.id.addingBtn)
        ItemList = ArrayList()
        recy = findViewById(R.id.recycler_view)

//RECYCLERVIEW
        adapter = Adapter(this, ItemList)
        recy.layoutManager = LinearLayoutManager(this)
        recy.adapter = adapter

//FUNCTION-CALL
        addButton.setOnClickListener { addInfo() }
        }

//FUNKTIONENS
    private fun addInfo() {
        val inflter = LayoutInflater.from(this)
        val v = inflter.inflate(R.layout.add_item_layout, null) //
        val eng = v.findViewById<EditText>(R.id.editText)
        val deu = v.findViewById<EditText>(R.id.editText2)

        val addDialog = AlertDialog.Builder(this)

        addDialog.setView(v)                        
        addDialog.setPositiveButton("OK"){ dialog, _->
            val eng2 = eng.text.toString()
            val deu2 = deu.text.toString()
            val UUID = UUID.randomUUID()
            ItemList.add(Item(UUID, eng2, deu2))
            adapter.notifyDataSetChanged()
            //Toast.makeText(this, "Adding Success", Toast.LENGTH_SHORT).show()
            dialog.dismiss()
        }

        addDialog.setNegativeButton("Cancel"){ dialog, _->
            dialog.dismiss()

        }
        addDialog.create()
        addDialog.show()

    }

    fun clearData() {

        ItemList.clear()                               
        adapter.notifyDataSetChanged()
        Toast.makeText(this, "Alles gelöscht", Toast.LENGTH_SHORT).show()
    }

    fun reset_all_EN() {
        //ArrayList = ItemList
        val size: Int = ItemList.size

        for (i in 0 until size) {

            if (text_view_de.visibility == View.VISIBLE) {
                text_view_en.visibility = View.VISIBLE
                text_view_de.visibility = View.GONE
            }
            adapter.notifyDataSetChanged()

        }
    }

    fun reset_to_EN() {

        // using forEach() method
        ItemList.forEach { test_if_german() }
    }

    fun reset_to_EN2() {

        for (item in ItemList) {
            test_if_german()
        }
    }

    fun test_if_german(){

        if (text_view_de.visibility == View.VISIBLE) {
            text_view_en.visibility = View.VISIBLE
            text_view_de.visibility = View.GONE
        }
        adapter.notifyDataSetChanged()
    }

//MENU CLASSES
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {

        menuInflater.inflate(R.menu.menu, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        when (item.itemId) {
            R.id.open_menu -> {

                val intent = Intent(this, InfoActivity::class.java)
                startActivity(intent)
            }
            R.id.open_menu2 -> {

                val intent = Intent(this, SettingsActivity::class.java)
                startActivity(intent)
            }
            R.id.reset_all -> {

                reset_to_EN2()
            }
        }
        return super.onOptionsItemSelected(item)
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 18:39:18

因为我没有看到任何关于text_view_detext_view_en的声明,所以我猜您使用的是来自废弃的Android扩展的合成视图属性。假设情况是这样的:

当您使用text_view_de时,它在视图层次结构中执行搜索,以查找它使用匹配ID找到的第一个视图。因此,即使在遍历项目列表的for循环中执行搜索,您也只能一次又一次地使用相同的视图。

编辑:我意识到您希望能够切换单个视图,您只是询问如何添加a按钮来将所有视图重置回同一种语言。如果是这样的话,向适配器添加一个属性是没有意义的,该适配器一次控制所有视图的状态,就像我在之前的答案修订版中所建议的那样。

相反,您需要更改数据模型,使其具有确定特定项应该显示的特定语言的布尔值。您现在在单击监听器中的问题是,它试图使用视图本身来确定项目更改时的状态,但当项目从屏幕上滚动回到屏幕上时,这将导致奇怪的故障,因为ViewHolders会被回收,并在不同的项目在屏幕上切换和返回时分配给它们。

要开始,将项状态的布尔值添加到item类中。我不知道你的班级现在是什么样子,所以根据需要调整一下:

代码语言:javascript
复制
data class Item (
    val UUID: Long, 
    val english: String, 
    val deutsch: String, 
    var isShowDeutch: Boolean = true
)

一个好的做法是让Adapter类为单击的项公开一个回调,这样外部类(活动)负责操作数据模型,而Adapter的责任仅限于将数据连接到视图,而不是操作数据。因此,创建一个回调,该活动可以实现该回调,从而切换单个项的isShowDeutsch属性。当您将数据绑定到视图时,请使用该项的isShowDeutsch来确定可见性。

在Adapter类中:

代码语言:javascript
复制
var onItemClickListener: ((itemPosition: Int)->Unit)? = null

//...

    // In ViewHolder:
    override fun onClick(view: View) {
        itemClickListener?.invoke(adapterPosition)
    }

//...

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val currentItem = ArrList[position]
    holder.textViewDe.text = currentItem.Deutsch
    holder.textViewEn.text = currentItem.Englisch
    holder.textViewDe.isVisible = currentItem.isShowDeutsch
    holder.textViewEn.isVibible = !currentItem.isShowDeutsch
}

在您的活动中,当您设置适配器时,您可以为它定义一个单击监听器,用于切换该单个项的状态并将更改通知适配器:

代码语言:javascript
复制
//RECYCLERVIEW
adapter = Adapter(this, ItemList)
recy.layoutManager = LinearLayoutManager(this)
recy.adapter = adapter
adapter.onItemClickListener = { position ->
    ItemList[position].apply { isShowDeutsch = !isShowDeutsch }
    adapter.notifyItemChanged(position)
}

最后,要将所有项重置回原来的语言,可以迭代列表中的项,然后通知适配器。在您的活动中这样做更合适,因为Adapter不应该负责操作数据。

代码语言:javascript
复制
fun resetLanguage() {
    for (item in ItemList) {
        item.isShowDeutsch = true
    }
    adapter.notifyDataSetChanged()
}

我还建议您将lateinit var ItemList: ArrayList<Item>更改为val ItemList = ArrayList<Item>()。在可变的var属性中有一个可变的列表类型是错误的,因为有两种不同的方法来更改它,并且它创造了让适配器查看与您的活动所使用的列表不同的列表的可能性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68549590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档