【问题标题】:ListView position changes after filtered过滤后ListView位置变化
【发布时间】:2018-11-24 13:39:29
【问题描述】:

我正在处理 ListView:

    val animals = arrayOf("cat","dog", "mouse", "parrot", "lion", "panda")
internal lateinit var adapter: ArrayAdapter<String>

    val list = findViewById(R.id.lista) as ListView
adapter = ArrayAdapter(
this@MainActivity,
android.R.layout.simple_list_item_1,
animals)
list.adapter = adapter

这是选中位置项的条件:

list.setOnItemClickListener { adapterView, view, i, l ->
        when(i) {
            0 -> {
                webView1.loadUrl("catweb1")
                phone.text = "catnumber"
                webView2.loadUrl("catweb2")
            }

            1 -> {
                webView1.loadUrl("dogweb1")
                phone.text = "dognumber"
                webView2.loadUrl("dogweb2")
            }

            2 -> {
                webView1.loadUrl("mouseweb1")
                phone.text = "mousenumber"
                webView2.loadUrl("mouseweb2")
            }

            3 -> {
                webView1.loadUrl("parroteweb1")
                phone.text = "parrotnumber"
                webView2.loadUrl("parrotweb2")
            }

            4 -> {
                webView1.loadUrl("lionweb1")
                phone.text = "lionumber"
                webView2.loadUrl("lionweb2")
            }

            5 -> {
                webView1.loadUrl("pandaweb1")
                phone.text = "pandanumber"
                webView2.loadUrl("pandaweb2")
            }
        }

我正在使用这 3 个按钮来让这些选定的项目完成它们的工作,因为 webView1 位于 website1 布局内,而 webView2 位于 website2 布局内。

        web1.setOnClickListener {
            ListView.visibility= View.GONE
            website1.visibility= View.VISIBLE
        }
        web2.setOnClickListener {
            ListView.visibility= View.GONE
            website2.visibility= View.VISIBLE
        }
        phone.setOnClickListener {
            makeCall(phone.text.toString())

        }

我正在使用 MenuSearch 在列表中进行搜索:

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android2="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <item
        android2:id="@+id/menuSearch"
        android2:icon="@android:drawable/ic_menu_search"
        android2:title="Search"
        app:showAsAction="always"
        app:actionViewClass = "android.widget.SearchView"/>

</menu>

这是代码:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater = menuInflater
    inflater.inflate(R.menu.menu_search, menu)
    val item = menu.findItem(R.id.menuSearch)
    val searchView = item.actionView as SearchView

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            return false
        }

        override fun onQueryTextChange(newText: String): Boolean {
            adapter.filter.filter(newText)

            return false
        }
    })

    return super.onCreateOptionsMenu(menu)
}

当列表未被过滤时一切正常,但我的问题在我使用过滤器后开始,如果我过滤 Panda,它会在单击 web1 按钮时始终加载 catweb1,而不是 pandaweb1,它会调用catnumber 在点击 phone 按钮时加载 catweb2 在点击 web2 按钮时加载。

我已经在这里寻找类似的问题,但我只找到了列表视图的所有复杂(至少对我而言)CustomedAdapters 的答案。

有没有一种简单的方法可以在我的项目被过滤后保持它们的位置?

或者我应该使用某种 Ifs 语句来代替吗?

【问题讨论】:

    标签: android listview kotlin position filtering


    【解决方案1】:

    您需要创建另一个列表来存储所有初始值,如下所示

    val listToFilter = mutablelistOf<...>()
    listToFilter.addAll(yourList) //storing all values
    

    然后

    yourList.clean() //first, clear your list
    yourList.addAll(listToFilter.filter {...}) //filtering on all values and giving them to your list
    //notify your adapter about the changes
    

    【讨论】:

    • 谢谢 Abner,但我无法让它工作,你能指出我应该在哪里添加代码吗?我收到了一个不匹配的类型:listToFilter.addAll(list) 和 .clean 和 addAll 中的未解析引用。
    【解决方案2】:

    过滤后,您的列表只有 1 或 2 个项目,因此 i 变量永远不会 > 2。要解决此问题,您需要动物数组的索引。

    将您的 when 语句更改为:

    when(animals.indexOfFirst { it == adapter.getItem(i) })

    【讨论】:

    • 工作!这解决了问题!
    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2022-11-30
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多