Как отфильтровать данные списка в порядке убывания kotlin? - PullRequest
0 голосов
/ 29 января 2020

Из приложения Android, которое я написал, я хочу добавить, добавить кнопку на панели инструментов, которая действует как переключатель. Когда переключатель отключен (состояние по умолчанию), все сообщения должны быть показаны, когда он включен (после касания), в списке должны отображаться только сообщения, для которых user_id установлен в 1 и отсортирован по убыванию publ_at. Повторное нажатие на кнопку вернет ее в состояние по умолчанию. Обратите внимание, что опубликованные на дату возврата, а также опубликованные Ат и user_id, полученные из postList с сервера, я хочу знать, как я могу реализовать вышеуказанное требование, какие шаги я должен выполнить

под моей реализацией logi c в MainActivity. kt

class MainActivity: AppCompatActivity () {

@Inject
lateinit var restInterface: RestInterface


private fun initializeDagger() = App.appComponent.inject(this)

var context: Context? = null
private var filteredList: List<Post>? = null



private var recyclerView: RecyclerView? = null
private var switch1: Switch? = null
private var restAdapter: RestAdapter? = null

private var postList: List<Post>? = null
private var restList: RestList? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    initializeDagger()
    recyclerView = findViewById(R.id.recycler_view)
    switch1 = findViewById(R.id.switch1)
    fetchPosts()

    switch1.setOnclickListener {

        postList.forEach { postItem: Post ->
            if (postItem.userId == 1)
                filteredList.add(postItem)
        }

        recyclerView.post = filteredList
        recyclerView.notifyDatasetChanged()

    }
    // Collections.sort( filteredList.get(4).publishedAt, Collections.reverseOrder());
}





private fun fetchPosts() {
    val progress = ProgressDialog(this)
    progress.setMessage("Loading... ")
    progress.isIndeterminate = true
    progress.show()
    restInterface?.getPosts?.subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(object : DisposableSingleObserver<Response<RestList>>() {
            override fun onSuccess(response: Response<RestList>) {
                restList = response.body()

                val layoutManager = LinearLayoutManager(applicationContext)
                recyclerView?.layoutManager = layoutManager

                // initialize postList with posts
                postList = restList?.posts
                restAdapter = postList?.let { RestAdapter(it, restList) }
                recyclerView?.adapter = restAdapter
            }

            override fun onError(e: Throwable) {
                progress.dismiss()
                Toast.makeText(context, "" + e.message, Toast.LENGTH_SHORT).show()
            }
        })

}

}

ниже моего RestAdapter.kt

class RestAdapter(val post: List<Post>,val restList: RestList?) : RecyclerView.Adapter<RestAdapter.PostHolder>() {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.post_list, null)
        return PostHolder(itemView)
    }

    override fun getItemCount(): Int {
        return post.size
    }


    override fun onBindViewHolder(holder: PostHolder, position: Int) {
        val posts = post[position]
        Picasso
            .get() // give it the context
            .load(posts.image) // load the image
            .into(holder.postImage)
        holder.userId.text = posts.userId.toString()
        holder.postTitle.text = posts.title
        holder.postTime.text = posts.publishedAt
        holder.postDescription.text = posts.description


    }

    class PostHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val postImage: ImageView = itemView.findViewById(R.id.postImage)
        val userId: TextView = itemView.findViewById(R.id.userId)
        val postTitle: TextView = itemView.findViewById(R.id.postTitle)
        val postTime: TextView = itemView.findViewById(R.id.postTime)
        val postDescription: TextView = itemView.findViewById(R.id.postDescription)

    }

}

1 Ответ

0 голосов
/ 30 января 2020

Вы можете использовать метод .sortedByDescending или .sortedBy в списке :)

[Редактировать] Я даю вам простое решение для этого, возможно, не лучшее, но должно работать 1. Измените конструктор RestAdapter на (var post : List, val restList: RestList?) Добавить метод updateData в apadapter:

fun filterData(isChecked: Boolean) {
   if (isChecked) {
         val filteredList = arrayListOf<Post>()
         filteredList.addAll(restList?posts.filter { it.user_id  == 1 }.sortedByDescending { it.published_at })
         post = filteredList
     } else {
         post = restList?.posts
     }
    notifyDatasetChanged()
}

И в вашем классе использовать это:

 switch1.setOnclickListener {

   restAdapter?.filterData(switch1.isChecked()//state of your switch i.e isChecked() which return true or false)
}
...