如何筛选Retrofit2 JSON响应只保留某些元素的ArrayList

时间:2019-02-02 15:52:44

标签: android json kotlin retrofit2

我是Kotlin的新手,所以这可能是一个非常容易解决的问题。

我要做的是在使用RecyclerView在网格中显示图像之前,先过滤使用Retrofit2收到的json响应。

instagram.com/explore/tags/{hashtag}/?__a=1&max_id=使用Retrofit2,我可以很好地获得数据响应,并在RecyclerView中显示给定的url图像。

我没有成功使用过滤器,映射,循环和条件从Arraylist中删除元素。我不明白这些的最大范围内,但我已经搜索寻找解决办法,而这些都是我想出APON。

接口

interface InstagramDataFetcher
{
    @GET("tags/{tag}/?__a=1&max_id=")
    fun getInstagramData(@Path("tag") hashtag: String) : Call <InstagramResponse>
}

我在哪里得到我的回应,也得到的StringIndexOutOfBoundsException

class InstagramFeedFragment : Fragment()
{
    private fun onResponse()
    {
        val service = RestAPI.retrofitInstance?.create(InstagramDataFetcher::class.java)

        val call = service?.getInstagramData("hashtag")

        call?.enqueue(object : Callback<InstagramResponse>
        {
            override fun onFailure(call: Call<InstagramResponse>, t: Throwable)
            {
                Log.d("FEED", " $t")
            }

            override fun onResponse(
                call: Call<InstagramResponse>, response: Response<InstagramResponse>
            )
            {

                //for ((index, value) in data.withIndex())
                if (response.isSuccessful)
                {
                    var data: ArrayList<InstagramResponse.InstagramEdgesResponse>? = null
                    val body = response.body()

                    data = body!!.graphql.hashtag.edge_hashtag_to_media.edges

                    for ((index, value) in data.withIndex())
                    {

                        if(value.node.accessibility_caption[index].toString().contains("text") ||
                            value.node.accessibility_caption[index].toString().contains("person"))
                        {
                            data.drop(index)
                        }
                    }

                    recyclerView.adapter = InstagramGridAdapter(data, parentFragment!!.context!!)
                }
            }
        })
    }
}

这是我的模型课

data class InstagramResponse(val graphql: InstagramGraphqlResponse)
{

    data class InstagramGraphqlResponse(val hashtag: InstagramHashtagResponse)

    data class InstagramHashtagResponse(val edge_hashtag_to_media: InstagramHashtagToMediaResponse)

    data class InstagramHashtagToMediaResponse(
        val page_info: InstagramPageInfo,
        val edges: ArrayList<InstagramEdgesResponse>
    )

    data class InstagramPageInfo(
        val has_next_page: Boolean,
        val end_cursor: String
    )

    data class InstagramEdgesResponse(val node: InstagramNodeResponse)

    data class InstagramNodeResponse(
        val __typename: String,
        val shortcode: String,
        val display_url: String,
        val thumbnail_src: String,
        val thumbnail_resources: ArrayList<InstagramThumbnailResourceResponse>,
        val is_video: Boolean,
        val accessibility_caption: String
    )

    data class InstagramThumbnailResourceResponse(
        val src: String,
        val config_width: Int,
        val config_height: Int
    )

}

再简单,我只想请从ArrayList中符合特定的东西是什么我不希望这样的元素。例如。来自json的“ is_video”值。我想通过在ArrayList和删除具有“is_video”作为真正的所有元素。

谢谢

1 个答案:

答案 0 :(得分:0)

如果你问如何过滤列表,然后在下面的演示。 您只需要在filter上使用data,它是一个ArrayList。我尝试为模型保留相同的结构,以便您可以更好地理解。

    fun main() {
        val first = InstagramNodeResponse(
            title = "first",
            is_video = true
        )

        val second = InstagramNodeResponse(
            title = "second",
            is_video = false
        )

        val list: ArrayList<InstagramEdgesResponse> = arrayListOf(
            InstagramEdgesResponse(node = first),
            InstagramEdgesResponse(node = second)
        )

        val itemsWithVideo = list.filter { it.node.is_video == true }
        val itemsWithoutVideo = list.filter { it.node.is_video == false }

        println(itemsWithVideo.map { it.node.title }) // [first]
        println(itemsWithoutVideo.map { it.node.title }) // [second]

    }

    // Models
    data class InstagramEdgesResponse(val node: InstagramNodeResponse)

    data class InstagramNodeResponse(
        val title: String,
        val is_video: Boolean
    )
相关问题