Kotlin开发中如何在Fragment内展示GridView,解决布局不显示问题
问题原因与解决方法
1. 核心问题:GridView控件初始化错误
你在Fragment成员变量位置直接通过activity?.findViewById找GridView,存在两个错误:
- Fragment初始化阶段还未绑定到Activity,
activity对象为null,最终gallerygrid取值为null,设置适配器的操作完全没有执行 - GridView是定义在Fragment的布局
R.layout.fragment_gallery中的,不属于Activity的视图树,就算Activity不为空也找不到这个控件
2. 次要问题:视图加载顺序错误
你在onCreateView方法中先执行设置适配器的逻辑,之后才inflate加载Fragment的布局,就算你找对了控件,此时布局还未加载,控件也处于空状态。
额外注意:请先确认你的
R.layout.fragment_gallery中GridView的id确实为galllerygrid(你代码中写的是三个l),如果是拼写错误也会导致找不到控件。
修改后的代码
Fragment部分修改
class Gallery : Fragment() { private var param1: String? = null private var param2: String? = null lateinit var adapter:GalleryAdapter // 不要提前初始化GridView var gallerygrid:GridView?=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? { // 第一步先加载Fragment根布局 val rootView = inflater.inflate(R.layout.fragment_gallery, container, false) // 第二步从根布局里找GridView gallerygrid = rootView.findViewById(R.id.galllerygrid) // 第三步初始化适配器并设置 adapter= GalleryAdapter(GalleryData.galleryphoto) gallerygrid?.adapter=adapter // 返回加载好的根布局 return rootView } // companion object部分保持原有代码即可 }
适配器可选优化(不影响显示,仅提升性能)
你当前的getView方法没有复用convertView,每次都重新inflate布局,列表滑动时性能较差,同时inflate时传null作为root会导致item布局的宽高参数失效,可以修改为:
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = convertView ?: LayoutInflater.from(parent?.context).inflate(R.layout.gallery_ticket, parent, false) val image = view.findViewById<ImageView>(R.id.gallery) image.setImageResource(galleryList[position].image) return view }
内容的提问来源于stack exchange,提问作者Raunit Verma
相关产品推荐
相关产品推荐

