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

Android应用获取GPS信号后Spinner卡在首个选项的问题求助

Spinner卡在第一个选项无法选择的问题修复方案

问题根源分析

  1. 重复创建并设置Adapter:每次Firebase数据更新或ProfileActivity重建时,都会创建全新的ArrayAdapter并绑定给Spinner,频繁重置Spinner的UI状态,导致交互卡顿。
  2. LocationListener未清理:FlyActivity中注册的GPS位置监听在返回时未取消,后台持续的位置更新占用主线程资源,干扰ProfileActivity的UI响应。
  3. 选中项获取时机错误:在onCreate阶段直接调用selectPlane.getSelectedItem()时,Firebase数据尚未加载完成,无法获取有效选中值,且无法响应后续用户选择。

具体修复步骤

1. 优化ProfileActivity的Spinner数据加载逻辑

将Adapter设为成员变量,复用实例而非每次创建新对象,避免UI状态丢失:

// 在ProfileActivity中添加成员变量
private ArrayAdapter<String> planeAdapter;
private List<String> planeList = new ArrayList<>();

修改onCreate中的Firebase监听代码:

Spinner selectPlane = binding.spinner;
// 初始化Adapter并绑定到Spinner
planeAdapter = new ArrayAdapter<>(ProfileActivity.this, android.R.layout.simple_spinner_item, planeList);
planeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
selectPlane.setAdapter(planeAdapter);

avioaneData.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        planeList.clear();
        for (DataSnapshot airplaneSnapshot : snapshot.getChildren()) {
            String airplaneCode = airplaneSnapshot.getKey();
            planeList.add(airplaneCode);
        }
        planeAdapter.notifyDataSetChanged(); // 仅更新数据,复用现有Adapter
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Log.d(TAG, "onCancelled: database error");
    }
});

2. 恢复OnItemSelectedListener正确获取选中项

取消注释OnItemSelectedListener代码,实时捕获用户选择:

selectPlane.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        selectedPlane = planeList.get(position);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        selectedPlane = null;
    }
});

同时修改跳转按钮的点击事件,确保获取最新选中值:

binding.button3.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (selectedPlane == null && planeList.size() > 0) {
            selectedPlane = planeList.get(0); // 兜底默认选中第一个
        }
        Toast.makeText(ProfileActivity.this,"merge avionu..."+selectedPlane,Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(ProfileActivity.this, FlyActivity.class);
        intent.putExtra("avion", selectedPlane);
        startActivity(intent);
        finish();
    }
});

3. 在FlyActivity中清理LocationListener

在onDestroy方法中取消位置监听,释放资源:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (locationManager != null) {
        locationManager.removeUpdates(this);
    }
}

同时修复权限请求后的逻辑,避免重复请求:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_LOCATION_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
            }
        }
    }
}

额外优化建议

  • 使用registerForActivityResult启动FlyActivity,避免直接重建ProfileActivity,保留原有页面状态。
  • 在ProfileActivity的onDestroy中移除Firebase的ValueEventListener,防止内存泄漏:
// 成员变量
private ValueEventListener planeValueListener;

// onCreate中赋值
planeValueListener = new ValueEventListener() {
    // ... 实现onDataChange和onCancelled
};
avioaneData.addValueEventListener(planeValueListener);

// onDestroy中移除
@Override
protected void onDestroy() {
    super.onDestroy();
    if (planeValueListener != null) {
        avioaneData.removeEventListener(planeValueListener);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:33:09