我正在try 创建一款应用程序,允许用户租用离他们最近的汽车.我想用一个TextView和ImageView来构建一个cardView一旦我找到了最近的汽车,我创建了方法BuildCardView来实现这一点.我的问题是cardView在被调用时没有被创建.当我直接调用BuildCardView时,它工作得很好,但在GeoQuery onKeyEntered方法内部调用时就不行了.我调试了代码,在onKeyEntered的内部调用了方法BuildCardView,但cardView不可见.下面是调用FireBase方法的代码.

FindCar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                   findClosestCars();
        }
    });

下面是调用BuildCardView的FireBase方法

private void findClosestCars() {
    if (ActivityCompat.checkSelfPermission(RentersMenuPageActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

     //  turnOnLocationUpdates();
        //fusedLocationClient.requestLocationUpdates(mLocationRequest, locationCallback, Looper.myLooper());

        databaseReference = FirebaseDatabase.getInstance().getReference("Users").child("Lenders");
        GeoFire geoFire = new GeoFire(databaseReference);
        GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(latitude, longitude), radius);
        geoQuery.removeAllListeners();

        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {
           //
                //  Toast.makeText(RentersMenuPageActivity.this, "You Found a Lender",Toast.LENGTH_LONG);
                  //      Toast.LENGTH_LONG).show();


                //showPictureAndPrice();

                if (!driverFound) {
                    driverFound = true;
                    driverFoundID = key;

                    closestLender = FirebaseDatabase.getInstance().getReference("Users").child("Lenders").child(driverFoundID);

                    String [] lenderLocations;

                    buildCardView();
                }

               radius++;
            }

下面是BuildCardView,它在主视图中inflating 一个较小的视图(直接调用时起作用,但不是从onkey enter调用时起作用)

private void buildCardView(){
    Toast.makeText(RentersMenuPageActivity.this, "You Found a Lender",Toast.LENGTH_LONG).show();

    LayoutInflater mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    View view =getLayoutInflater().inflate(R.layout.card,null);

   // CardView cardView = view.findViewById(R.id.cardView);
    Button rentCarButton = view.findViewById(R.id.rentCarButton);
    TextView price= view.findViewById(R.id.price);
    TextView makeandmodel = view.findViewById(R.id.makeandmodel);
    ImageView imageView =view.findViewById(R.id.imageViewScroll);

    LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    linearLayout.addView(view);
}

推荐答案

OnKeyEntered方法是在与主线程不同的线程中调用的,因此您在该方法中对UI所做的任何更改都将不可见.

要解决此问题,您需要更新主线程上的UI.您可以使用runOnUiThread方法来执行此操作

private void buildCardView(){
    runOnUiThread(new Runnable() {
        public void run() {
            ...

Java相关问答推荐

Java中不同包中的类之间的配置共享

空手道比赛条件

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

Java LocalTime.parse在本地PC上的Spring Boot中工作,但在Docker容器中不工作

JPanel透支重叠的JComcoBox

当Volatile关键字真的是必要的时候?

Java ArrayList的整数和数组的泛型

用OSQL创建索引

Java连接池无法正常工作

虚拟线程应该很快消亡吗?

允许同时执行两个方法,但不能同时执行这两个方法

在settings.gradle.kts和Build.gradle.kts中使用公共变量

舰队运行配置Maven版本

垃圾回收器是否真的删除超出作用域的对象?

如何在透视表中添加对计数列的筛选?

在使用具有不同成本的谓词调用allMatch之前对Java流进行排序会带来什么好处吗?

在Spring Boot中使用咖啡因进行缓存

具有 DayOfWeek 列表的 JPA 实体

人们在 IntelliJ 上将-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080放在哪里?

Keycloak + Spring Boot 角色认证不起作用