无法用字符串数组填充ListView Fragment,求故障排查与解决方法
问题分析与解决
崩溃核心原因
你遇到的Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference错误,根源是字符串数组itemArray中存在大量null元素——当ArrayAdapter遍历数组渲染列表项时,会对每个元素调用toString(),遇到null就触发空指针异常。
看代码就能定位问题:
int j = 0; String itemArray[ ] = new String[size]; // ... for(ItemClass i : items){ itemArray[j] = i.getTitle(); // 这里缺少j++的操作! }
循环中始终只给itemArray[0]赋值,后续所有数组位置都是null,这是导致崩溃的直接原因。
另外还有两个潜在问题:
- ArrayAdapter布局参数错误:你传入的
R.layout.activity_listview是整个ListView所在的布局文件,而不是单个列表项的布局。ArrayAdapter需要的是单个item的布局(比如系统自带的android.R.layout.simple_list_item_1,或自定义的仅含TextView的布局)。 - 空指针防护缺失:直接调用
mainActivity.alist和items.size()前未判空,若mainActivity为null或alist为空,会提前触发崩溃。
修正后的完整代码
public class ListviewFragment extends Fragment implements AdapterView.OnItemClickListener, View.OnClickListener { private LinkedList<ItemClass> linkedList; private ListView listView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.frag_listviewfragment, container, false); // 增加宿主Activity判空 if (!(getActivity() instanceof MainActivity)) { Log.e("MyTag", "当前宿主不是MainActivity"); return v; } MainActivity mainActivity = (MainActivity) getActivity(); LinkedList<ItemClass> items = mainActivity.alist; // 增加数据源判空 if (items == null || items.isEmpty()) { Log.d("UI thread", "列表为空"); return v; } int size = items.size(); String itemArray[] = new String[size]; int j = 0; for(ItemClass i : items){ Log.d("UI thread", "当前item描述: " + i.getdescription()); itemArray[j] = i.getTitle(); Log.d("UI thread", "添加到数组的内容: " + i.getTitle()); j++; // 必须递增索引,确保每个数组位置都被赋值 } // 使用系统默认的列表项布局,也可替换为你自定义的单个item布局 ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, itemArray); if (adapter == null) { Log.e("MyTag","Adapter初始化失败"); return v; } listView = v.findViewById(R.id.list); if(listView == null){ Log.e("MyTag","ListView未找到"); return v; } listView.setAdapter(adapter); listView.setOnItemClickListener(this); // 直接在这里设置点击监听 return v; } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onClick(View view) {} @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {} }
关键修正点
- 给循环中的索引
j添加j++,确保数组每个位置都被正确赋值。 - 替换ArrayAdapter的布局参数为单个列表项的布局(如
android.R.layout.simple_list_item_1)。 - 增加多处空指针判断,避免因宿主Activity、数据源为空导致的崩溃。
- 将ListView的点击监听移到
onCreateView中,确保ListView初始化完成后再设置。
内容的提问来源于stack exchange,提问作者deeko
相关产品推荐
相关产品推荐

