需要帮助以在工具栏中进行自动完成的textview

时间:2019-11-07 15:38:19

标签: android kotlin

我尝试在工具栏内创建一个自动完成的textview,但是当我从列表中加载数据时它不成功。我的代码: CountryAdapter

class CountryAdapter(
context: Context, resource: Int, textViewResourceId: Int, var items: List<CountryItem>) : ArrayAdapter<CountryItem>(context, resource, textViewResourceId, items) {
internal var tempItems: List<CountryItem> = ArrayList(items)
internal var suggestions: MutableList<CountryItem> = ArrayList()

/**
 * Custom Filter implementation for custom suggestions we provide.
 */
private var nameFilter: Filter = object : Filter() {
    override fun convertResultToString(resultValue: Any): CharSequence {
        return (resultValue as CountryItem).countryName
    }

    override fun performFiltering(constraint: CharSequence?): FilterResults {
        return if (constraint != null) {
            suggestions.clear()
            for (people in tempItems) {
                if (people.countryName.toLowerCase().contains(constraint.toString().toLowerCase())) {
                    suggestions.add(people)
                }
            }
            val filterResults = FilterResults()
            filterResults.values = suggestions
            filterResults.count = suggestions.size
            filterResults
        } else {
            FilterResults()
        }
    }

    override fun publishResults(constraint: CharSequence, results: FilterResults?) {
        val filterList = results!!.values as ArrayList<CountryItem>
        if (results.count > 0) {
            clear()
            for (people in filterList) {
                add(people)
                notifyDataSetChanged()
            }
        }
    }
}

init {
    // this makes the difference.
}

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
    var view = convertView
    if (convertView == null) {
        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        view = inflater.inflate(R.layout.country_autocomplete_row, parent, false)
    }
    val people = items[position]
    val lblName = view!!.findViewById(R.id.text_view_name) as TextView
    val img = view.findViewById(R.id.image_view_flag) as ImageView
    lblName.text = people.countryName
    img.setImageResource(people.flagImage)
    return view
}

override fun getFilter(): Filter {
    return nameFilter
}

}

主要活动

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
var countryList : List<CountryItem>?= null

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

    fab.setOnClickListener { view ->
        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
            .setAction("Action", null).show()
    }

    val toggle = ActionBarDrawerToggle(
        this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close
    )
    drawer_layout.addDrawerListener(toggle)
    toggle.syncState()

    fillCountryList()

    nav_view.setNavigationItemSelectedListener(this)
}

override fun onBackPressed() {
    if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
        drawer_layout.closeDrawer(GravityCompat.START)
    } else {
        super.onBackPressed()
    }
}

private fun fillCountryList() {
    countryList = mutableListOf(
        CountryItem(1,"Afghanistan", R.drawable.afghanistan),
        CountryItem(2,"Bangladesh", R.drawable.bangladesh),
        CountryItem(3,"China", R.drawable.china),
        CountryItem(4,"India", R.drawable.india),
        CountryItem(5,"Japan", R.drawable.japan),
        CountryItem(6,"Nepal", R.drawable.nepal),
        CountryItem(7,"North Korea", R.drawable.nkorea),
        CountryItem(8,"South Korea", R.drawable.skorea),
        CountryItem(9,"Srilanka", R.drawable.srilanka),
        CountryItem(10,"Pakistan", R.drawable.pakistan)
    )
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)

    // Get the search menu.
    val searchMenu = menu.findItem(R.id.app_bar_menu_search)

    // Get SearchView object.
    val searchView = MenuItemCompat.getActionView(searchMenu) as SearchView

    // Get SearchView autocomplete object.
    val searchAutoComplete =
        searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text) as SearchView.SearchAutoComplete
    searchAutoComplete.setBackgroundColor(Color.BLUE)
    searchAutoComplete.setTextColor(Color.GREEN)
    searchAutoComplete.setDropDownBackgroundResource(android.R.color.holo_blue_light)

    // Create a new ArrayAdapter and add data to search auto complete object.
    val dataArr = arrayOf("Afghanistan", "Bangladesh", "China", "India", "North Korea", "South Korea", "Srilanka", "Pakistan")

// val newsAdapter = ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,dataArr)         val newsAdapter = CountryAdapter(this,R.layout.activity_main,R.id.text_view_name,countryList !!)         searchAutoComplete.setAdapter(newsAdapter)

    // Listen to search view item on click event.
    searchAutoComplete.onItemClickListener =
        AdapterView.OnItemClickListener { adapterView, view, itemIndex, id ->
            val queryString = adapterView.getItemAtPosition(itemIndex) as String
            searchAutoComplete.setText("" + queryString)
            Toast.makeText(this@MainActivity, "you clicked $queryString", Toast.LENGTH_LONG).show()
        }

    // Below event is triggered when submit search query.
    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            val alertDialog = AlertDialog.Builder(this@MainActivity).create()
            alertDialog.setMessage("Search keyword is $query")
            alertDialog.show()
            return false
        }

        override fun onQueryTextChange(newText: String): Boolean {
            if (newText.isNotEmpty()){
                return true
            }

            return false
        }
    })

    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    when (item.itemId) {
        R.id.action_settings -> return true
        R.id.app_bar_menu_search -> return true
        else -> return super.onOptionsItemSelected(item)
    }
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    // Handle navigation view item clicks here.
    when (item.itemId) {
        R.id.nav_camera -> {
            // Handle the camera action
        }
        R.id.nav_gallery -> {

        }
        R.id.nav_slideshow -> {

        }
        R.id.nav_manage -> {

        }
        R.id.nav_share -> {

        }
        R.id.nav_send -> {

        }
    }

    drawer_layout.closeDrawer(GravityCompat.START)
    return true
}

}

如果我使用数组字符串可以,但是当我使用列表时会给我错误

  

E / Android运行时:致命异常:主要       流程:com.robusta.autocompletesearchview,PID:16164       java.lang.IllegalArgumentException:指定为非null的参数为null:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数约束           在com.robusta.autocompletesearchview.CountryAdapter $ nameFilter $ 1.publishResults(未知来源:24)           在android.widget.Filter $ ResultsHandler.handleMessage(Filter.java:282)           在android.os.Handler.dispatchMessage(Handler.java:106)           在android.os.Looper.loop(Looper.java:193)           在android.app.ActivityThread.main(ActivityThread.java:6669)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

0 个答案:

没有答案