Фрагмент не раздувается при щелчке элемента в RecyclerView - PullRequest
0 голосов
/ 27 февраля 2020

Итак, я создаю стандартное Android приложение с Kotlin. Мое приложение реализует TabLayout с одной вкладкой, содержащей список RecyclerView.

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

В OnCreateView () В моем списке фрагментов, где я реализую свой RecyclerView, я инструктирую слушателя следующим образом:

    //Give action to item click in adapter
    adapter.onItemClick = { 

        //Setup new fragment Item
        val newFragment = ItemFragment()

        // parentFragmentManager is the same as activity?.supportFragmentManager
        parentFragmentManager.beginTransaction()
            .replace(R.id.list_fragment_id, newFragment)
            .addToBackStack(null) //Makes it possible to comeback to recyclerview
            .commit()
    }

Я думаю, что моя ошибка лежит где-то вокруг идентификатора текущего контейнера, так как приложение настраивается в TabLayout. Я пытался использовать идентификатор моего пейджера просмотра или даже RecyclerView, но ничего не помогло.

Любая помощь была бы чрезвычайно полезна!

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Попробуйте следующий код, который в java преобразует его в kotlin самостоятельно:)

Сначала объявите переменную в вашем адаптере

Fragment fragment = null;
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;

После добавления приведенного ниже кода в методе onclick

fragment = new CategoryFragment();
fragmentManager = ((FragmentActivity)getContext()).getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frameLayoutHome, fragment);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.commit();
0 голосов
/ 27 февраля 2020

Наконец-то нашел ответ сам: ')

Это действительно l ie в контейнере вашего взгляда.

.replace(R.id.list_fragment_id, newFragment) не работает, потому что вы не можете заменить фрагмент макетом, это нужно сделать с помощью VIEW

.replace(R.id.viewPager, newFragment) не работает, потому что viewPager - это представление, представляющее все ваши просмотр фрагментов, а не только того, который вы ищете

.replace(R.id.recyclerview, newFragment) не может содержать другой фрагмент

ТАК Я вложил свое окно повторного просмотра в мой файл XML в RelativeLayout, который представляет фактический КОНТЕЙНЕР что мы должны sh заменить фрагмент на!

Это должно выглядеть примерно так:

<RelativeLayout
    android:id="@+id/recyclerview_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        tools:listitem="@layout/recyclerview_item"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</RelativeLayout>

Если я допустил ошибку, пожалуйста, дайте мне знать!

0 голосов
/ 27 февраля 2020

Вместо adapter.onItemClick = ...

Вы должны поместить прослушиватель кликов в представление ViewHolder

Класс Adaper

override fun onCreateViewHolder(parent:ViewGroup, viewType:Int):MyViewHolder{
{
  return MyViewHolder(view, myClickListener)
}

Класс ViewHolder

class MyViewHolder : ViewHolder(v:View, myClickListener:ClickListener?) {
   itemView.onClick = { myClickListener?.clicked() };
}
...