科特林:在一个碎片里列表



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

这是我的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

只是为了解释发生了什么

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
}

看到我把方法末尾放在哪里了吗?您刚刚return生成了一个值,该值退出了该方法。它也总是运行(没有if检查,只有在满足某些条件时才会返回),所以代码的其余部分不可能运行。IDE应该警告你这一点,突出显示该方法的其余部分,并在你悬停在上时说无法访问的代码或类似的话


但还有一件事需要小心,我看到人们在这里遇到过。假设你没有立即返回你膨胀的第一个布局,所以方法的其余部分可以运行——你仍然在膨胀第二个布局。

这不仅没有必要,现在你必须小心你使用的是哪一个-如果你配置了第二个,但返回了第一个,那么显示的是没有列表的那个。或者,如果你不小心在一个布局上配置了一些东西,而在另一个布局中配置了其他东西,最终两个布局都没有正确设置,所以无论你返回哪个,都会出现问题。

这种问题可能出现在很多不同的情况下,所以更多的是要注意你在做什么。充气两个单独的布局应该是一个危险信号(当然,除非你有特定的、有意的理由!)——就像为同一个ListViewRecyclerView创建两个Adapter一样

onCreateView中,删除您拥有的行:

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

您对布局的夸大程度超过了您的要求。请遵循以下代码。

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
}

最新更新