You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中ListView/ArrayAdapter的OnItemClick事件空指针错误求助

解决ListView点击时的NullPointerException问题

看起来你的问题出在lv.getItemAtPosition(position).toString()这一行——getItemAtPosition(position)返回了null,所以调用toString()时抛出了空指针异常。我们一步步来排查和修复:

核心问题分析

这个错误说明你的ListView的Adapter要么没有正确绑定数据源,要么数据源(name数组)里存在null元素。从你提供的代码来看,listner(eventName)方法里完成了数据库查询和数组初始化,但缺少了给ListView设置Adapter的关键代码,而且点击事件的处理也不够健壮。

修复步骤

1. 补全Adapter的初始化与绑定

在listner方法的JSON解析循环结束后,需要创建ArrayAdapter并绑定到ListView。比如:

private void listner(String item){
    String getData = null;
    String dbResult = "empty";
    dbConnect database = new dbConnect(this);
    try {
        Date c = Calendar.getInstance().getTime();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = df.format(c);
        String query = "SELECT c.workshopname, b.starttime, b.endtime FROM events as a inner join scedules as b on a.eventid = b.eventid inner join workshops as c on b.workshopid = c.workshopid where b.workshopid = c.workshopid and b.eventid = (select eventid from events where eventname = '" + item + "') order by b.starttime;";
        getData = "?query=" + URLEncoder.encode(query, "UTF-8");
        String link = "https://jackstest.000webhostapp.com/androiddbconnect.php" + getData;
        dbResult = database.execute(link).get();
    } catch (Exception e){
        e.printStackTrace();
    }
    try{
        JSONArray ja = new JSONArray(dbResult);
        JSONObject jo = null;
        name = new String[ja.length()];
        beginning = new String[ja.length()];
        end = new String[ja.length()];
        for(int i = 0; i < ja.length(); i++){
            jo = ja.getJSONObject(i);
            // 确保正确获取字段值,注意数据库字段名是否和这里一致
            name[i] = jo.getString("workshopname");
            beginning[i] = jo.getString("starttime");
            end[i] = jo.getString("endtime");
        }
        // 关键:创建Adapter并绑定到ListView
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, name);
        lv.setAdapter(adapter);
    } catch (JSONException e) {
        e.printStackTrace();
        Toast.makeText(this, "Failed to load workshop data", Toast.LENGTH_SHORT).show();
    }
}

2. 优化点击事件的处理,避免空指针

不要直接依赖lv.getItemAtPosition(position),而是直接从你的数据源name数组中取值,同时增加空值检查:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 先检查数据源是否有效,以及position是否在合法范围内
        if (name != null && position >= 0 && position < name.length) {
            String selectedWorkshop = name[position];
            if (selectedWorkshop != null && !selectedWorkshop.isEmpty()) {
                Intent intent = new Intent(scedule.this, workshop.class);
                intent.putExtra("eventname", selectedWorkshop);
                startActivity(intent);
            } else {
                // 处理空值情况,给用户提示
                Toast.makeText(scedule.this, "Workshop information is missing", Toast.LENGTH_SHORT).show();
            }
        }
    }
});

3. 额外的健壮性优化

  • 检查eventName是否有效:在listner方法开头增加判断,避免无效的数据库查询:
    private void listner(String item){
        if (item == null || item.trim().isEmpty()) {
            Toast.makeText(this, "No valid event selected", Toast.LENGTH_SHORT).show();
            return;
        }
        // 后续逻辑...
    }
    
  • 避免主线程阻塞:database.execute(link).get()是同步网络请求,会阻塞UI线程导致ANR(应用无响应),建议改成异步回调的方式处理网络请求结果。
  • Java命名规范:类名首字母要大写,比如scedule改成Schedule,workshop改成Workshop,这样代码更符合规范且易读。

这些改动应该能解决你遇到的空指针问题,同时让你的代码更健壮。

内容的提问来源于stack exchange,提问作者acesteef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:14