如何将XAMPP接口返回的数据显示到Android的TextView控件中
改造方案与问题修复
问题现状
- 原有实现:基于RecyclerView完成接口数据展示
- 需求:改用TextView控件展示接口返回数据
- 现存问题:接口回调中
results变量无法正常读取 - 错误参考截图:

原有代码
Android端数据加载代码
private void loadDataMahasiswa() { progress = new ProgressDialog(this); progress.setCancelable(false); progress.setMessage("Loading ..."); progress.show(); String nip = editTxtnip.getText().toString(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(URL) .addConverterFactory(GsonConverterFactory.create()) .build(); LoginAPI api = retrofit.create(LoginAPI.class); Call<Value> call = api.view3(nip); call.enqueue(new Callback<Value>() { @Override public void onResponse(Call<Value> call, Response<Value> response) { String value = response.body().getValue(); progress.dismiss(); if (value.equals("1")) { results = response.body().getResult(); viewAdapter = new RecyclerViewAdapter3(Lihat_izin.this, results); recyclerView.setAdapter(viewAdapter); } } @Override public void onFailure(Call<Value> call, Throwable t) { } }); }
PHP服务端接口代码
<?php require_once('dbConnect.php'); date_default_timezone_set("Asia/Jakarta"); $timestamp = date('Y-m-d'); if($_SERVER['REQUEST_METHOD']=='GET') $opd = $_GET['opd'];{ $sql = "SELECT COUNT(*)FROM(SELECT DISTINCT waktu,status from absen_pagi where opd='$opd' AND waktu='$timestamp')as dt"; $res = mysqli_query($con,$sql); $result = array(); while($row = mysqli_fetch_array($res)){ array_push($result, array('waktu'=>$row['COUNT(*)'])); } echo json_encode(array("value"=>1,"result"=>$result)); mysqli_close($con); }
问题修复与改造实现
1. 修复PHP接口语法&逻辑问题
原有PHP代码存在两个核心问题:
- if判断未正确包裹大括号,仅
$opd = $_GET['opd'];一行受请求方法判断控制,后续逻辑无论什么请求都会执行 - COUNT查询未设置字段别名,直接取
$row['COUNT(*)']存在兼容性问题,易导致返回数据结构异常
修复后代码:
<?php require_once('dbConnect.php'); date_default_timezone_set("Asia/Jakarta"); $timestamp = date('Y-m-d'); if($_SERVER['REQUEST_METHOD']=='GET') { $opd = isset($_GET['opd']) ? $_GET['opd'] : ''; // 给COUNT结果设置别名total,方便取值 $sql = "SELECT COUNT(*) as total FROM(SELECT DISTINCT waktu,status from absen_pagi where opd='$opd' AND waktu='$timestamp') as dt"; $res = mysqli_query($con,$sql); $result = array(); while($row = mysqli_fetch_assoc($res)){ array_push($result, array('waktu'=>$row['total'])); } echo json_encode(array("value"=>1,"result"=>$result)); mysqli_close($con); }
注意:直接拼接GET参数到SQL语句存在SQL注入风险,生产环境请改用PDO或mysqli预处理语句传参。
2. Android端改造为TextView展示
首先在对应布局文件中添加TextView控件,配置唯一id(示例用tv_result),之后修改loadDataMahasiswa方法逻辑,移除RecyclerView适配器相关代码,增加空指针防护,直接将解析后的数据设置给TextView即可。
修改后代码:
private void loadDataMahasiswa() { ProgressDialog progress = new ProgressDialog(this); progress.setCancelable(false); progress.setMessage("Loading ..."); progress.show(); String nip = editTxtnip.getText().toString(); // 绑定布局中的TextView控件,替换为你自己的控件id TextView tvResult = findViewById(R.id.tv_result); Retrofit retrofit = new Retrofit.Builder() .baseUrl(URL) .addConverterFactory(GsonConverterFactory.create()) .build(); LoginAPI api = retrofit.create(LoginAPI.class); Call<Value> call = api.view3(nip); call.enqueue(new Callback<Value>() { @Override public void onResponse(Call<Value> call, Response<Value> response) { progress.dismiss(); // 增加响应判空,避免空指针 if (response.isSuccessful() && response.body() != null) { String value = response.body().getValue(); if ("1".equals(value)) { List<Result> results = response.body().getResult(); if (results != null && !results.isEmpty()) { // 根据业务需求拼接要展示的内容 StringBuilder contentBuilder = new StringBuilder(); for (Result item : results) { contentBuilder.append("当日打卡统计人数:").append(item.getWaktu()); } tvResult.setText(contentBuilder.toString()); } else { tvResult.setText("暂无对应数据"); } } else { tvResult.setText("数据加载失败"); } } else { tvResult.setText("接口请求异常"); } } @Override public void onFailure(Call<Value> call, Throwable t) { progress.dismiss(); // 失败场景给用户明确提示 tvResult.setText("网络请求失败:" + t.getMessage()); } }); }
3. 额外校验项
请确认Retrofit对应的Value、Result实体类字段和接口返回的JSON字段完全匹配,Result类中必须存在waktu字段对应的属性与get/set方法,否则会出现Gson解析失败,导致results变量读取异常。
内容的提问来源于stack exchange,提问作者tantina devega
相关产品推荐
相关产品推荐

