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

如何将XAMPP接口返回的数据显示到Android的TextView控件中

改造方案与问题修复

问题现状

  • 原有实现:基于RecyclerView完成接口数据展示
  • 需求:改用TextView控件展示接口返回数据
  • 现存问题:接口回调中results变量无法正常读取
  • 错误参考截图: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:45:34