当前位置: 首页 > 知识库问答 >
问题:

W/RecyclerView:未连接适配器;跳过布局

东门涵育
2023-03-14

我制作了一个基本的购物清单应用程序,它利用回收器视图来显示列表项目。我正在尝试使用带有片段的导航添加设置屏幕。我遇到了我的回收器视图的问题

主活动.kt

package com.example.shoppinglist

import android.app.Dialog
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton

class MainActivity : AppCompatActivity(), RVAdapter.ListItemClickInterface {
lateinit var itemsRV: RecyclerView
lateinit var addFAB: FloatingActionButton
lateinit var list: List<ListItems>
lateinit var RVAdapter: RVAdapter
lateinit var viewModel: ViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupActionBarWithNavController(findNavController(R.id.fragment_main))
    itemsRV = findViewById(R.id.recyclerView)
    addFAB = findViewById(R.id.idFABAdd)
    list = ArrayList<ListItems>()
    RVAdapter = RVAdapter(list, this)
    itemsRV.layoutManager = LinearLayoutManager(this)
    itemsRV.adapter = RVAdapter
    val repository = Repository(Database(this))
    val factory = ViewModelFactory(repository)
    viewModel = ViewModelProvider(this, factory).get(ViewModel::class.java)
    viewModel.getAllListItems().observe(this, Observer {
        RVAdapter.list = it
        RVAdapter.notifyDataSetChanged()
    })

    addFAB.setOnClickListener {
        openDialog()
    }

}

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.fragment_main)
    return navController.navigateUp() || super.onSupportNavigateUp()
}

fun openDialog() {
    val dialog = Dialog(this)
    dialog.setContentView(R.layout.add_dialog)
    val cancelButton = dialog.findViewById<Button>(R.id.idBtnCancel)
    val addButton = dialog.findViewById<Button>(R.id.idBtnAdd)
    val itemEdt = dialog.findViewById<EditText>(R.id.idEditItemName)
    val itemQuantityEdt = dialog.findViewById<EditText>(R.id.idEditItemQuantity)

    cancelButton.setOnClickListener {
        dialog.dismiss()
    }
    addButton.setOnClickListener {
        val itemName: String = itemEdt.text.toString()
        val itemQuantity: String = itemQuantityEdt.text.toString()
        if (itemName.isNotBlank() && itemQuantity.isNotBlank()) {
            val items = ListItems(itemName, itemQuantity)
            viewModel.insert(items)
            Toast.makeText(applicationContext, "Item Added", Toast.LENGTH_SHORT).show()
            RVAdapter.notifyDataSetChanged()
            dialog.dismiss()
        } else {
            Toast.makeText(applicationContext, "Enter All Info To Add Item", 

Toast.LENGTH_SHORT)
                    .show()
            }
        }
        dialog.show()
    }

    override fun onItemClick(listItems: ListItems) {
        viewModel.delete(listItems)
        RVAdapter.notifyDataSetChanged()
        Toast.makeText(applicationContext, "Item Deleted", Toast.LENGTH_SHORT).show()
    }
}

HomeFragment.kt

package com.example.shoppinglist

import android.os.Build
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.navigation.fragment.findNavController
import androidx.preference.PreferenceManager
import kotlinx.android.synthetic.main.fragment_home.*

class HomeFragment : Fragment()  {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        idFABSettings.setOnClickListener {
            findNavController().navigate(R.id.action_homeFragment_to_settingsFragment)
        }

        loadSettings()
    }

    @RequiresApi(Build.VERSION_CODES.N)
    private fun loadSettings(){
        val sp = PreferenceManager.getDefaultSharedPreferences(context)

        val theme = sp.getBoolean("theme_switch",false)

    }

}

设置Fragment.kt

package com.example.shoppinglist

import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat

class SettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey)
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/fragment_main"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/navigation"
        />

</RelativeLayout>

fragment\u home.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="?attr/colorPrimary"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@layout/list_rv_item"/>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/idFABAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:layout_marginBottom="20dp"
        android:backgroundTint="?attr/colorSecondary"
        android:contentDescription="Add Item Button"
        android:src="@drawable/ic_add"
        android:tint="@android:color/white" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/idFABSettings"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:layout_marginBottom="20dp"
        android:backgroundTint="?attr/colorSecondary"
        android:contentDescription="Add Item Button"
        android:src="@drawable/ic_settings"
        android:tint="@android:color/white" />

</RelativeLayout>

navigation.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/navigation"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.example.shoppinglist.SettingsFragment"
        android:label="Settings" >
        <action
            android:id="@+id/action_settingsFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.shoppinglist.HomeFragment"
        android:label="Shopping List"
        tools:layout="@layout/fragment_home" >
        <action
            android:id="@+id/action_homeFragment_to_settingsFragment"
            app:destination="@id/settingsFragment" />
    </fragment>
</navigation>

不确定是否需要更多信息。提前道歉-我是android studio的新手

共有1个答案

苍烨然
2023-03-14

您正试图通过Mainactive使用特定于HomeFraank布局的视图。这将无法正常工作。第一次启动活动时,在onCreate中,您使用findViewById查找具有ID回收器View的视图,它成功地找到了它,因为当时该视图是HomeFraank的一部分,它在布局中。

但是,当您更改片段时,原始片段视图将被分离并删除。当您返回到第一个片段时,Android会创建HomeFragment及其布局的新实例。MainActivity仍在引用HomeFragment第一个实例中的原始RecyclerView,因此它将更新不再显示在屏幕上的视图,并且不会触及新视图。实际上,您已经创建了一个内存泄漏,MainActivity正在阻止第一个片段的视图被破坏。

您尚未发现的另一个问题可能是,如果在SettingsFragment打开时旋转屏幕,则会出现NullPointerException崩溃。这是因为屏幕旋转将导致创建新活动,因此将再次调用onCreate(),当HomeFragment不在布局中时,当它尝试查找回收视图时,它将失败。

使用托管活动中片段的特定视图是没有意义的。活动不应该知道有关片段中的内容以及如何处理该片段的内容的任何详细信息。您所有与回收人员视图有关的代码都应该在HomeFraank中。

 类似资料:
  • 当应用程序启动时,我得到一个空白屏幕,当我检查日志时,我得到:E/回收人员视图:没有连接适配器;跳过布局错误 我不知道为什么?任何想法,它似乎没有附加回收器视图或添加任何数据,我附加了Main活动、DataAdapter和数据类。 主要活动 数据适配器 下面是我的数据类,将从中提取数据 我ncluded.java 收集器和设置器 这是jsonResponse类,在接口中引用 感谢任何帮助。

  • 我已经创建了一个片段,在该片段中有一个recycle view,但是当我的片段被加载时,什么也没有显示,它给出了这个错误“E/recycle view:没有连接适配器;跳过布局”。下面是适配器和片段类的代码,任何帮助都将不胜感激 适配器类: 片段类: fragment _ view _ all _ my _ recipes . XML view_all_recipe_item.xml

  • 我想从火力点实时数据库显示图片。(带有加密图像(字符串))类似加密图像是“照片” 函数loadPhoto() 问题出在哪里?我连接adapter和recyclerview,并设置GridManager。

  • ListPetientFragment。JAVA 错误是:2021-11-17 18:41:02.417 29997-29997/?E/rtphonemedicat:运行时设置的未知位_标志:0x8000 2021-11-17 18:41:03.628 29997-30029/com。尼戈特。smartphonemedicate E/GED:无法获取GED日志Buf,错误(0)2021-11-17

  • 大家晚上好,我一直在寻找一个解决方案,以解决android studio的日志发送错误,使用RecyclerView显示JSON“产品”列表,并进行了改装。 我已经阅读了与此错误相关的问题,但我无法找到符合我需求的正确答案。 Android:回收人员视图:没有附加适配器;跳过布局 未连接适配器;跳过布局回收视图错误 recyclerview未连接适配器;跳过布局 未连接适配器;跳过布局onCrea