簡體   English   中英

如何過濾Retrofit2 Json響應以僅將某些元素保留在ArrayList中

[英]How To Filter Retrofit2 Json Response To Keep Only Certain Elements In ArrayList

我是Kotlin的新手,所以這可能是一個非常容易解決的問題。

我想做的是在使用RecyclerView在網格中顯示圖像之前,過濾使用Retrofit2收到的json響應。

instagram.com/explore/tags/{hashtag}/?__a=1&max_id=使用Retrofit2,我可以很好地獲得數據響應,並在RecyclerView中顯示給定的url圖像。

我沒有成功使用過濾器,映射,循環和條件從Arraylist中刪除元素。 我無法完全理解這些內容,但是我一直在尋找解決方案,而這些正是我的追求。

接口

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”為真的元素。

謝謝

如果您詢問如何過濾列表,則下面是演示。 您只需要對作為ArrayList的data使用filter 我嘗試過為模型保留相同的結構,以便您可以更好地理解。

    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
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM