如何在ListView创建时修改指定元素(首项)的背景色
问题原因
在onCreateView方法中,你虽然给ListView设置了适配器,但此时ListView还未完成测量、布局和子View的创建流程,调用getChildAt()会返回null,自然触发空指针异常。
解决方案
这里提供两种可靠的实现方式:
方式一:利用ListView的post延迟执行
通过post()将修改操作加入消息队列,等待ListView完成绘制后再执行:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_manage, container, false); listView = root.findViewById(R.id.listView); listArrayAdapter = new ArrayAdapter<>(root.getContext(), R.layout.list_item, R.id.listNameTextView, elementList); listView.setAdapter(listArrayAdapter); // 延迟到ListView绘制完成后修改第一个item listView.post(new Runnable() { @Override public void run() { View firstItem = listView.getChildAt(0); if (firstItem != null) { // 注意:000是八进制数,实际黑色应使用Color.BLACK或0xFF000000 firstItem.setBackgroundColor(Color.BLACK); } } }); return root; }
方式二:自定义Adapter处理(推荐)
这种方式适配ListView的View复用机制,避免滚动时出现样式错乱问题,同时能确保第一个item的背景色始终正确设置:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_manage, container, false); listView = root.findViewById(R.id.listView); // 自定义ArrayAdapter,重写getView方法 listArrayAdapter = new ArrayAdapter<>(root.getContext(), R.layout.list_item, R.id.listNameTextView, elementList) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); // 判断是否为第一个item if (position == 0) { view.setBackgroundColor(Color.BLACK); } else { // 恢复默认背景色,防止View复用导致其他item样式异常 view.setBackgroundColor(Color.TRANSPARENT); // 替换为你的默认背景色 } return view; } }; listView.setAdapter(listArrayAdapter); return root; }
注意:你代码里写的
000是八进制表示,实际要设置黑色应该用Color.BLACK或者十六进制0xFF000000,否则会得到不符合预期的颜色。
内容的提问来源于stack exchange,提问作者Silent_Jager
相关产品推荐
相关产品推荐

