0

I am using array and HashMap to sort Firebase child with children count and setting that into a dropDown array in Lotlin list. The problem is the dropdown items are not displayed. I need to sort Firebase child Like political with its child count and I try to adding that into ArrayAdapter of dropdown like this:

adapbl = ArrayAdapter<String>(this,R.layout.dropdownbl,keyarray)

autocomplete.setAdapter(adapbl)

Firebase database image:
Firebase database image

Dropdown not displayed image:
Dropdown not displayed image

Activity code:

class TrendingPosts : AppCompatActivity() {
    private lateinit var bottomnav : BottomNavigationView
    private var pTime : Long = 0
        private lateinit var itembl: Array<String>
        private lateinit var adapbl : ArrayAdapter<String>
        private lateinit var autocomplete : AutoCompleteTextView
        private lateinit var content: ArrayList<String>
        private lateinit var keyarray: Array<String>
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_trending_posts)
             content = ArrayList<String>()
             
             content.add("POLITICAL")
            content.add("ENTERTAINMENT")
            content.add("SOCIAL")
            content.add("ENVIRONMENT")
            var  hm = HashMap<String,String>()

            for(item : String in content ){
                val database: FirebaseDatabase = FirebaseDatabase.getInstance()
                val myRef: DatabaseReference = database.getReference("ContentType").child(item)

                myRef.addValueEventListener(object : ValueEventListener{
                    @SuppressLint("SetTextI18n")
                    override fun onDataChange(snapshot: DataSnapshot) {
                        val text:String = snapshot.childrenCount.toString()
                            hm.put(item,text)
                    }

                    override fun onCancelled(error: DatabaseError) {

                    }
                })
            }
            var sortedmap = hm.toList().sortedBy{
                (k,v)-> v }.toMap()
            keyarray = sortedmap.keys.toTypedArray()

            autocomplete = findViewById(R.id.BL_Lang_On)

            
            adapbl = ArrayAdapter<String>(this,R.layout.dropdownbl,keyarray)
            autocomplete.setAdapter(adapbl)
            autocomplete.setOnItemClickListener{ parent,view,position,id ->
                val languages : String = parent.getItemAtPosition(position).toString()
                createSnackbar(
                    "SELECTED: "+languages
                )

            }

            bottomnav = findViewById(R.id.bottomnavigation)
            bottomnav.selectedItemId = R.id.ctrend
            bottomnav.setOnNavigationItemSelectedListener { item ->
                when(item.itemId){
                    R.id.home ->{
                        startActivity(Intent(this, MainActivity::class.java))
                        overridePendingTransition(0,0)
                        
                        true
                    }

                    R.id.cv ->{
                        startActivity(Intent(this, activity_for_playing_soma_videos::class.java))
                        overridePendingTransition(0,0)
                        
                        true
                    }

                    R.id.ch ->{
                        startActivity(Intent(this, ForSomasunthaVideoActivity_CH::class.java))
                        overridePendingTransition(0,0)
                        
                         true
                    }

                    R.id.ctrend ->{
                        overridePendingTransition(0,0)
                         true
                    }

                    R.id.csearch->{
                       // return true
                        
                        startActivity(Intent(this, Search::class.java))
                        overridePendingTransition(0,0)
                        true
                    }
                 
                }
                 false
            }
        }

        private fun createSnackbar(message: String){
            val mainsh: View = findViewById(R.id.trendcons)
            Snackbar.make(mainsh, message, Snackbar.LENGTH_SHORT).show()
        }
    }

I got fixed this by adding runOnUiThread {}.

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
  • Step 1 is to stop ignoring potential errors and implement `onCancelled`. At its minimum that should be `public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }` --- Next, your code ignores the fact that `onDataChange` is invoked asynchronously. Your `hm.toList().sortedBy{...}` runs before `hm` contains any data. To learn more about that, see https://stackoverflow.com/questions/50434836/getcontactsfromfirebase-method-return-an-empty-list/50435519#50435519 – Frank van Puffelen May 14 '23 at 14:02
  • As Frank already mentioned, there is no way you can do that. Firebase API is asynchronous. So please check the duplicate to see how can you solve this using a callback. You might also be interested in reading this [resource](https://medium.com/firebase-tips-tricks/how-to-read-data-from-firebase-realtime-database-using-get-269ef3e179c5). – Alex Mamo May 15 '23 at 05:07
  • Thanks For Your Suggestion But I Got Fixed that Using another method and maybe my question is not duplicate – LORD SHIVA PRODUCT May 15 '23 at 07:34

0 Answers0