Вам нужно перенаправить пользователя на другую страницу, когда он нажимает на элемент списка / конвертирует текущие элементы списка в кнопки? - PullRequest
0 голосов
/ 19 июня 2020

Я пытался создать функцию поиска так, чтобы, если пользователь ищет элемент, лишние элементы go удалялись, когда они ищут на панели инструментов, и когда они нажимают на элемент, они переходят к заданному c страницу для этого элемента. В настоящее время у меня есть этот код, который я спас, просмотрев кого-то на YouTube. Мне нужна помощь, так как я новичок. Спасибо!

college_search. xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/college_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.testrun3.CollegeSearch"/>

CollegeSearch.kt

package com.example.testrun3

import android.content.Context
import androidx.recyclerview.widget.RecyclerView
import androidx.appcompat.widget.SearchView
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.college_search.*
import kotlinx.android.synthetic.main.country_child.view.*
import android.os.Bundle as Bundle1

class CollegeSearch : AppCompatActivity() {

    var countries:MutableList<String> = ArrayList()
    var displayList:MutableList<String> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle1?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.college_search)
        loadData()
        // country_list.layoutManager = LinearLayoutManager(this)
        college_list.layoutManager = GridLayoutManager(this,1)
        college_list.adapter = CountryAdapter(displayList,this)

    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.main,menu)
        val searchItem = menu.findItem(R.id.college_search_menu)
        if(searchItem != null){
            val searchView = searchItem.actionView as SearchView
            val editext = searchView.findViewById<EditText>(androidx.appcompat.R.id.search_src_text)
            editext.hint = "Search here..."

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

                override fun onQueryTextChange(newText: String?): Boolean {

                    displayList.clear()
                    if(newText!!.isNotEmpty()){
                        val search = newText.toLowerCase()
                        countries.forEach {
                            if(it.toLowerCase().contains(search)){
                                displayList.add(it)
                            }
                        }
                    }else{
                        displayList.addAll(countries)
                    }
                    college_list.adapter?.notifyDataSetChanged()
                    return true
                }

            })
        }

        return super.onCreateOptionsMenu(menu)
    }


    class CountryAdapter(items : List<String>,ctx:Context) : RecyclerView.Adapter<CountryAdapter.ViewHolder>(){

        private var list = items
        private var context = ctx

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

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder?.name?.text = list[position]
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            return ViewHolder(LayoutInflater.from(context).inflate(R.layout.country_child,parent,false))
        }


        class ViewHolder(v: View) : RecyclerView.ViewHolder(v){
            val name = v.country_name!!
        }
    }

    private fun loadData(){
        countries.add("Afghanistan")
        countries.add("Albania")
        countries.add("Algeria")
        countries.add("Andorra")
        countries.add("Angola")
        countries.add("Antigua and Barbuda")
        countries.add("Argentina")
        countries.add("Armenia")
        countries.add("Australia")
        countries.add("Austria")
        countries.add("Azerbaijan")
        countries.add("Bahamas")
        countries.add("Bahrain")
        countries.add("Bangladesh")
        countries.add("Barbados")
        countries.add("Belarus")
        countries.add("Belgium")
        countries.add("Belize")
        countries.add("Benin")
        countries.add("Bhutan")
        countries.add("Bolivia")
        countries.add("Bosnia and Herzegovina")
        countries.add("Botswana")
        countries.add("Brazil")
        countries.add("Brunei")
        countries.add("Bulgaria")
        countries.add("Burkina Faso")
        countries.add("Burundi")
        countries.add("Cabo Verde")
        countries.add("Cambodia")
        countries.add("Cameroon")
        countries.add("Canada")
        countries.add("Central African Republic (CAR)")
        countries.add("Chad")
        countries.add("Chile")
        countries.add("China")
        countries.add("Colombia")
        countries.add("Comoros")
        countries.add("Democratic Republic of the Congo")
        countries.add("Republic of the Congo")
        countries.add("Costa Rica")
        countries.add("Cote d'Ivoire")
        countries.add("Croatia")
        countries.add("Cuba")
        countries.add("Cyprus")
        countries.add("Czech Republic")
        countries.add("Denmark")
        countries.add("Djibouti")
        countries.add("Dominica")
        countries.add("Dominican Republic")
        countries.add("Ecuador")
        countries.add("Egypt")
        countries.add("El Salvador")
        countries.add("Equatorial Guinea")
        countries.add("Eritrea")
        countries.add("Estonia")
        countries.add("Ethiopia")
        countries.add("Fiji")
        countries.add("Finland")
        countries.add("France")
        countries.add("Gabon")
        countries.add("Gambia")
        countries.add("Georgia")
        countries.add("Germany")
        countries.add("Ghana")
        countries.add("Greece")
        countries.add("Grenada")
        countries.add("Guatemala")
        countries.add("Guinea")
        countries.add("Guinea-Bissau")
        countries.add("Guyana")
        countries.add("Haiti")
        countries.add("Honduras")
        countries.add("Hungary")
        countries.add("Iceland")
        countries.add("India")
        countries.add("Indonesia")
        displayList.addAll(countries)
    }
}

main. xml

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:title="Search"
        android:id="@id/college_search_menu"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        />

</menu>

1 Ответ

0 голосов
/ 20 июня 2020

Сначала вы создаете OnClickListener в onBindViewHolder() вашего CountryAdapter

holder.name.setOnClickListener {
    val intent = Intent(context, YourActivity::class.java)
    context!!.startActivity(intent)
}

Вот как вы устанавливаете OnClickListener для элемента в адаптере. Здесь мы используем намерение для запуска другого действия при щелчке по элементу.

Теперь класс Intent в приведенном выше решении принимает два параметра. Первый - это Context, который является текущим действием с какой пользователь взаимодействует. Это используется для передачи текущего фокуса, в котором должно открыться новое действие. Это не должно быть null. Второй - это класс активности, на который должно переключиться приложение. Activity открывается в стеке, что означает «Последний пришел - первым ушел».

Затем вы запускаете созданное намерение, используя startActivity(Intent). Но, поскольку это не Activity, вам также необходимо передать ему контекст. Но где же контекст?

Здесь: class CountryAdapter(items : List<String>,ctx:Context). Видите ли, вы уже объявили его как аргумент, а также передали его из действия как college_list.adapter = CountryAdapter(displayList,this). Это this - контекст, который вы передали адаптеру.

Я сказал, используйте ctx. Зачем? потому что вы назвали контекст ctx в своем адаптере, что не имеет значения, потому что это переменная, и вы можете называть ее как хотите. Такой же контекстный механизм необходим в Fragments.

Также. помните, что в действии вы передаете this в качестве контекста в качестве параметра, но не нуждаетесь в нем для вызова таких методов, как startActivity().

Итак, окончательный результат для вашего адаптера или Fragment's onClickListener:

holder.name.setOnClickListener {
    val intent = Intent(ctx, YourActivity::class.java)
    ctx.startActivity(intent)
}

В случае действия:

//In activity, you don't even need to pass the rootView to access the elemets as in adapter or Fragments.
name.setOnClickListener {
    val intent = Intent(this, YourActivity::class.java)
    startActivity(intent)
}

Теперь , вам просто нужно разработать новое действие для элемента. Кроме того, с таким большим количеством элементов вы не захотите создавать столько действий. Итак, создайте такое же структурированное действие, передайте ему выбранный элемент и делайте с ним все, что хотите.

Вы можете сделать это, передав выбранный элемент через намерение, используя .putExtra().

//It takes two parameters: First one is the key name you want to give to the value passed
//Second one is the actual value you pass
intent.putExtra("SelectedCountry",list[position])
//This will put the selected country with the intent request.
//put it before just startActivity

Теперь откройте его в следующем упражнении как:

//Here, you have to use the data type based extra for the value you've passed.
//As we have passed a string, we're using getStringExtra, same for int getIntExtra()
//It takes the key name as the input, key should exactly match in both the activities
val selectedCountry = intent.getStringExtra("SelectedCountry")
//Now, do whatever you want with this country name in the new activity.

Это очень подробный ответ, надеюсь, вы все это узнаете. Кроме того, со временем ты узнаешь.

...