Intereting Posts
Как сделать UpdateOrInsert в коллекциях Котлина Комната: получение ошибки при использовании @Transaction Оператор as и ClassCastException Не вызывайте setOnClickListener для AdapterView Как издеваться над объектом Котлина с помощью Mockito / PowerMockito? Восстановить N-арное дерево из списка Как реализовать ленивый адаптер recyclerView для загрузки, например realm recyclerView, используя kotlin Определите глобальную функцию в Kotlin, которую я буду использовать в html-файле для использования в качестве обратного вызова onclick В чем разница между плюсом и плюсом при перегрузке оператора котлин? Добавление перехватчика к уже созданному клиенту okHttp3 Varargs Kotlin Java interop не работает должным образом Есть ли способ ограничить видимость функций stdlib в Котлине? Плагин kapt не работает с gradle-script-kotlin Вызывать компилятор Kotlin из Java-программы Почему знак плюса должен быть в конце строки, а не в начале на следующей строке?

Почему нажатие на элементы RecyclerView возвращает неверный идентификатор элемента?

Почему нажатие на элементы RecyclerView возвращает неверный идентификатор элемента? (Он изменился в зависимости от прокрутки списка)

У меня есть Activity с кнопкой внутри. Я нахожу диалог, когда пользователь нажимает кнопку. Внутри диалога у меня есть RecyclerView . Мой адаптер RecyclerView использует веб-службу для извлечения списка:

 setRecyclerViewAdapter(recycleView,1) val dialogBuilder = AlertDialog.Builder(this) val dialogView = this.layoutInflater.inflate(R.layout.dialog_menu, null) dialogBuilder.setView(dialogView) val b = dialogBuilder.create() b.show() 

Ниже приведен код для получения данных из webservice и настройки адаптера RecyclerView :

 private fun setRecyclerViewAdapter(recycleList:RecyclerView,subjectId:Int){ recycleList.layoutManager =LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false) doAsync { categoryList= GetSubCategoriesWebService() .SetRecyclerViewAdapter(subjectId) uiThread { } onComplete { val onClick= View.OnClickListener { val returnIntent = Intent() returnIntent.putExtra("result", result[0].toString()) setResult(Activity.RESULT_OK, returnIntent) finish() } val adapter = CategoryList_Adapter(categoryList,onClick,result) recycleList.adapter = adapter adapter.notifyDataSetChanged() } } } 

В CategoryList_Adapter я использую onClick setOnClickListener для RecyclerView setOnClickListener

Обратите внимание, что Result представляет собой массив, в котором пользователь сохраняет клики на элементах RecyclerView и возвращает Id в действие, и он заполняется в CategoryList_Adapter .


Это код CategoryList_Adapter:

 class CategoryList_Adapter(private val dataList: ArrayList<CategoryListObject>?, private val listener: View.OnClickListener?, private val adSubjectId :IntArray?) : RecyclerView.Adapter<CategoryList_Adapter.ItemRowHolder>() { override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ItemRowHolder { val rowNumber = getItemViewType(i) val view = LayoutInflater.from(viewGroup.context) .inflate(R.layout.category_listview_row, viewGroup, false) return ItemRowHolder(view, rowNumber, dataList!![i].id) } override fun onBindViewHolder(itemRowHolder: ItemRowHolder, i: Int) { Log.d("position ", i.toString()) itemRowHolder.itemTitle.text = dataList!![i].title } inner class ItemRowHolder(view: View, rowNumber: Int, subjectId: Int) : RecyclerView.ViewHolder(view) { var itemTitle: TextView init { view.setOnClickListener(listener) if(adSubjectId!=null) adSubjectId[0]=subjectId } } 

Зачем?

Спасибо за терпеливость.

Solutions Collecting From Web of "Почему нажатие на элементы RecyclerView возвращает неверный идентификатор элемента?"

Да, у меня такая же проблема, но я решил ее использовать интерфейс. Во-первых, вы создадите интерфейс класса click в классе адаптера.

ex: public class TestAdapter расширяет RecyclerView.Adapter {

 Context context; OnTapClickListner tapClick; List<ModelClass> datas; public TestAdapter(Context context,OnTapClickListner tapClick,List<ModelClass> datas) { super(); this.context = context; this.mediaClick = mediaClick; this.datas = datas; } @Override public void onBindViewHolder(ViewHolder holder, int position) { ModelClass mainData = datas.get(position); holder.View.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tapClick.onItemClick(mainData); } } } @Override public int getItemCount() { return datas.size(); } public interface OnTapClickListner { void onItemClick(ModelClass data); } } 

вы установили интерфейс так, как в классе adpter. то вы будете использовать адаптер в своем основном классе, а onclick будет выглядеть так:

 TestAdapter.OnTapClickListner itemClick = new TestAdapter.OnTapClickListner() { @Override public void onItemClick(ModelClass data) { } } 

Itemclick используйте в своем adpter вот так:

 new TestAdapter(this,itemClick,datas);