android-fragments Kotlin:ListVew在一个片段中

7ajki6be  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(163)

我试图在一个片段中创建一个非常简单的列表视图,但是我做错了一些事情,列表视图没有显示在屏幕上。
这是我的fragmentWifi.kt

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [fragmentWifi.newInstance] factory method to
 * create an instance of this fragment.
 */
class fragmentWifi : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

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

        // Inflate the layout for this fragment
        //return inflater.inflate(android.R.layout.fragment_wifi, container, false)

        val contentView: View = inflater.inflate(R.layout.fragment_wifi, container, false)
        val listView: ListView = contentView.findViewById(R.id.wifiList)
        val buttonScan: Button = contentView.findViewById(R.id.scanBtn)

        // sample data
        val list: MutableList<String> = ArrayList()
        for (i in 0..99) list.add("Item $i")
        //val listAdapter = customAdapter(this, list)
        //val listAdapter = ArrayAdapter(this, R.layout.simple_list_item, list)
        val listAdapter = ArrayAdapter(this.requireContext(), R.layout.simple_list_item, list)
        listView.adapter = listAdapter
        return contentView
    }





    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment fragmentwifi.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            fragmentWifi().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}

这是我的fragment_wifi.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/wifiList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.97"/>

    <Button
        android:id="@+id/scanBtn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_gravity="bottom"
        android:layout_margin="15dp"
        android:background="@android:color/holo_red_light"
        android:text="Scan WiFi networks"/>
</LinearLayout>

这是R.layout.simple_list_item

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

我认为问题出在fragmentWifi.kt类的第55行:

val listAdapter = ArrayAdapter(this.requireContext(), R.layout.simple_list_item, list)

我是否传递了错误的上下文?我也尝试了super.requireContext(),但没有任何变化。我甚至尝试创建一个自定义的arrayadapter,结果总是一样的:c

3zwtqj6y

3zwtqj6y1#

只是为了解释一下

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

        // ------------ end of method -----------

        val contentView: View = inflater.inflate(R.layout.fragment_wifi, container, false)
        val listView: ListView = contentView.findViewById(R.id.wifiList)
        val buttonScan: Button = contentView.findViewById(R.id.scanBtn)

        // sample data
        val list: MutableList<String> = ArrayList()
        for (i in 0..99) list.add("Item $i")
        //val listAdapter = customAdapter(this, list)
        //val listAdapter = ArrayAdapter(this, R.layout.simple_list_item, list)
        val listAdapter = ArrayAdapter(this.requireContext(), R.layout.simple_list_item, list)
        listView.adapter = listAdapter
        return contentView
    }

看到我把 end of method 放在哪里了吗?你刚刚对一个值进行了return运算,它退出了这个方法。(没有if检查只在满足某个条件时返回),因此其余的代码将永远无法运行。IDE应该就此发出警告,突出显示该方法的其余部分,并在将鼠标悬停在该方法上时显示 * 无法访问的代码 * 或类似内容
但是还有一件事需要注意,我在这里看到人们遇到过。假设你没有立即返回你膨胀的第一个布局,那么方法的其余部分可以运行--你仍然在膨胀第二个布局。
这不仅是不必要的,现在你必须小心你使用的是哪一个-如果你配置了第二个,但返回第一个,得到显示的是一个没有列表等。或者如果你不小心配置了一些东西在一个布局,其他东西在另一个,最后没有一个布局设置正确,所以无论你返回它都会有问题。
这类问题可能在很多不同的情况下出现,所以更多的是要注意你在做什么。膨胀两个独立的布局应该是一个危险信号(当然,除非您有特定的、有意的原因要这样做!)-与为同一个ListViewRecyclerView创建两个Adapter相同,等等。您明白了-这可能是您无意中做的事情,但当您真正去寻找问题的原因时,它应该看起来可疑

insrf1ej

insrf1ej2#

在您的***onCreateView***中,删除包含以下内容的行:

return inflater.inflate(R.layout.fragment_wifi, container, false)
62o28rlo

62o28rlo3#

您扩大的布局超出了您的要求。请遵循以下代码。

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val contentView = inflater.inflate(R.layout.fragment_wifi, container, false)
    val listView: ListView = contentView.findViewById(R.id.wifiList)
    val buttonScan: Button = contentView.findViewById(R.id.scanBtn)

    // sample data
    val list: MutableList<String> = ArrayList()
    for (i in 0..99) list.add("Item $i")
    //val listAdapter = customAdapter(this, list)
    //val listAdapter = ArrayAdapter(this, R.layout.simple_list_item, list)
    val listAdapter = ArrayAdapter(this.requireContext(), R.layout.simple_list_item, list)
    listView.adapter = listAdapter
    return contentView
}

相关问题