Как отфильтровать ответ Retrofit2 Json, чтобы сохранить только некоторые элементы в ArrayList - PullRequest
0 голосов
/ 02 февраля 2019

Я новичок в kotlin, так что, возможно, это очень легко решить.

Я пытаюсь отфильтровать ответ json, полученный с помощью Retrofit2, перед тем, как отобразить изображения в сетке.с RecyclerView.

instagram.com/explore/tags/{hashtag}/?__a=1&max_id= Использование Retrofit2 Я могу получить точный ответ на данные, а также отобразить заданные изображения URL в RecyclerView.

Мне не удалось использоватьфильтр, карта, петли и условия для удаления элементов из 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
    )

}

Простоопять же, я хочу просто удалить из массива элементы, которые соответствуют определенным вещам, чего я не хочу.Например.значение is_video, полученное из json.Я хочу пройти через arraylist и удалить все элементы, для которых is_video имеет значение true.

Спасибо

1 Ответ

0 голосов
/ 02 февраля 2019

Если вы спрашиваете, как отфильтровать список, то ниже приведена демоверсия.Вам просто нужно использовать 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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...