JSONRequest成功后的Android Update View

时间:2016-10-29 17:02:09

标签: java android kotlin

我正在构建一个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()
                }

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

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

根本不知道Kotlin,但我会尝试使用Java术语来解释。

重新定义您的方法以接受Volley侦听器作为Activity的回调。

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