Onclick в переработчикеПросмотреть неправильные позиции - PullRequest
1 голос
/ 22 марта 2020

У меня есть recyclerView с 10 именами и в этом activity возможен поиск по имени. При щелчке по имени activity перемещается в другое (с помощью Intents для перемещения по DetailsActivity). Это возможно сделать, потому что в адаптере у меня есть функция, которая задает позицию, на которую нажал пользователь. Но при вводе слова в меню поиска этот функционал дает позицию 1 (реальная позиция имени, в настоящий момент). Я могу отправить в функцию в adpter, например, идентификатор имени? Как правильно это сделать?

MainActivity.kt

    class MainActivity : AppCompatActivity(), PeopleInStarWarsAdapter.OnNoteListener {
    private lateinit var mainViewModel: MainViewModel
    private var listDataPeople = ArrayList<DataPeople>()
    private lateinit var dataPeopleAdapter: PeopleInStarWarsAdapter

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

        mainViewModel = ViewModelProvider
            .AndroidViewModelFactory
            .getInstance(application)
            .create(MainViewModel::class.java)

        //iniciar ViewModel
        mainViewModel.init(this)

        mainViewModel.getList().observe(this, Observer{ it ->
            if(it != null){
                listDataPeople = it
                dataPeopleAdapter.submitList(listDataPeople)
            }
            else{
                Toast.makeText(this, "Something is wrong!", Toast.LENGTH_SHORT).show()
            }
        })

        initRecyclerView(listDataPeople)
    }

    private fun initRecyclerView(listDataPeople : ArrayList<DataPeople>) {
        recycler_view.layoutManager = LinearLayoutManager(this)
        dataPeopleAdapter = PeopleInStarWarsAdapter(listDataPeople, this)
        recycler_view.adapter = dataPeopleAdapter
    }

    override fun onNoteClick(position: Int){
        val intent = Intent(this, DetailsActivity::class.java)
        intent.putExtra(BuildConfig.POSITION, position)
        startActivity(intent)
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.main_menu, menu)

        val manager =  getSystemService(Context.SEARCH_SERVICE) as SearchManager
        val searchItem = menu?.findItem(R.id.search)
        val searchView = searchItem?.actionView as SearchView

        searchView.setSearchableInfo(manager.getSearchableInfo(componentName))
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
            override fun onQueryTextSubmit(query: String): Boolean {
                searchView.clearFocus()
                searchView.setQuery("", false)
                searchItem.collapseActionView()

                Log.v("Information", "Looking for $query")
                mainViewModel.checkMatch(query, this@MainActivity)
                return true
            }
            override fun onQueryTextChange(newText: String): Boolean {
                Log.v("Information", "$newText")
                return false
            }
        })
        return true
    }
}

PeopleInStarWarsAdapter.kt

    class PeopleInStarWarsAdapter(listDataPeople: ArrayList<DataPeople>, onNoteListener: OnNoteListener) : RecyclerView.Adapter<RecyclerView.ViewHolder>(){
    var listDataPeople = ArrayList<DataPeople>()
    private var mOnNoteListener : OnNoteListener

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

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

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is ViewHolder -> {
                holder.ViewHolder(listDataPeople[position], mOnNoteListener)
            }
        }
    }

    fun submitList(dataPeopleList: ArrayList<DataPeople>) {
        this.listDataPeople = dataPeopleList
        notifyDataSetChanged()
    }

    class ViewHolder constructor(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener {
        private val textViewName : TextView = itemView.textView_name
        var onNoteListener: OnNoteListener? = null

        fun ViewHolder(dataPeople: DataPeople, onNoteListener: OnNoteListener) {
            val name = dataPeople.name
            this.textViewName.text = name
            this.onNoteListener = onNoteListener
            itemView.setOnClickListener(this)
        }

        override fun onClick(v: View?) {
            onNoteListener?.onNoteClick(adapterPosition)
        }
    }

    interface OnNoteListener {
        fun onNoteClick(position: Int)
    }

    init {
        this.listDataPeople = listDataPeople
        mOnNoteListener = onNoteListener
    }
}

1 Ответ

1 голос
/ 22 марта 2020

Вы должны отправить position на ViewHolder .

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    when (holder) {
        is ViewHolder -> {
            holder.ViewHolder(listDataPeople[position], mOnNoteListener,position)
        }
    }
}

Затем передать это значение в onNoteClick ()

fun ViewHolder(dataPeople: DataPeople, onNoteListener: OnNoteListener,position: Int) {
        val name = dataPeople.name
        this.textViewName.text = name
        this.onNoteListener = onNoteListener
        itemView.setOnClickListener(this)
    }

    override fun onClick(v: View?) {
        onNoteListener?.onNoteClick(position)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...