JSONRequest成功后的Android更新视图

我正在构建一个Android应用程序(我正在使用Kotlin而不是JAVA,但是如果能让我的Java方法很好),应该使用OpenWeather API显示天气信息。 我已经设定了观点:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="@dimen/activity_horizontal_margin"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/layCity"> <TextView android:id="@+id/txtCity" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="PORTO" android:textSize="25sp" android:textStyle="bold"/> <TextView android:id="@+id/txtCountry" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="(PT)" android:textSize="25sp"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/layTempDetail" android:layout_below="@+id/layCity" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtCurTemp" android:text="20º" android:textSize="40sp" android:textStyle="bold" android:layout_marginTop="20dp"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lblMinTemp" android:text="Min:" android:textStyle="bold" android:textSize="20sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtMinTemp" android:text="10º" android:textSize="20sp"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lblMaxTemp" android:text="Max:" android:textStyle="bold" android:textSize="20sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtMaxTemp" android:text="30º" android:textSize="20sp"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lblPressure" android:text="Pressure:" android:textStyle="bold" android:textSize="20sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtPressure" android:text="100" android:textSize="20sp"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/lblHumidity" android:text="Humidity:" android:textStyle="bold" android:textSize="20sp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/txtHumidity" android:text="30%" android:textSize="20sp"/> </LinearLayout> </LinearLayout> </RelativeLayout> 

然后我有另一个类负责提出请求,并单独更改每个字段,如下所示:

 public fun getCityInfo(name: String){ val URI = String.format("http://api.openweathermap.org/data/2.5/weather?q=%s&appid=", name) Log.d("uri", URI) var cityName: String = "" queue.add(JsonObjectRequest( URI, null, { cityName = it.getString("name") var main = it.getJSONObject("main") var temp: Double = main.getDouble("temp") //getting the rest of the info //I save the info that I need in a class var currTemp = CurrentTemperature(temp,press,humidity,min,max,state,desc,icon) var city = City(name, currTemp) //then set each field individually var detailsview = (context as AppCompatActivity).findViewById(R.id.layDetails) as View (detailsview.findViewById(R.id.txtCity) as TextView).setText(city.name) (detailsview.findViewById(R.id.txtCurTemp) as TextView).setText(city.currTemp.curr.toString()) }, { Toast.makeText(context, "Failed to get weather", Toast.LENGTH_LONG).show() } 

但是我想要的是成功返回城市实例,然后在我的字段中有一些自动更新视图的绑定。

我怎样才能做到这一点?

根本不了解Kotlin,但是我会尽量用Java术语来解释。

重新定义您的方法接受作为回调到活动的排雷监听器。

 public fun getCityInfo(name: String, callback: Response.Listener<JSONObject>) 

然后,你调用这个函数,传入这个闭包作为callback

 getCityInfo("Chicago", { var cityName = it.getString("name") var main = it.getJSONObject("main") var temp: Double = main.getDouble("temp") //getting the rest of the info var currTemp = CurrentTemperature(temp,press,humidity,min,max,state,desc,icon) var city = City(name, currTemp) setCity(city) // TODO: implement method within Activity }) 

注意一个增加的setCity 。 你需要实现这个来更新你拥有的任何视图。

现在,在其他类中,只需传递Activity中的响应侦听器即可

 queue.add(JsonObjectRequest( URI, null, callback, { ... } // error handle