我的 recycleView 不适用于 dropdrown 选择(Android Kotlin)

问题描述 投票:0回答:1

MainActivity.kt:

package com.example.smstest


import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.net.Uri

import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.Telephony
import android.telephony.SmsManager
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.AutoCompleteTextView

import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import java.util.Date
import kotlin.properties.Delegates

@Suppress("DEPRECATION")

class MainActivity : AppCompatActivity() {
private fun sendSms(phoneNumber: String, message: String) {

    val smsManager = SmsManager.getDefault()
    smsManager.sendTextMessage(phoneNumber, null, message, null, null)
}

private var titlesList = mutableListOf<String>()
private var descList = mutableListOf<String>()
private var imagesList = mutableListOf<Int>()




override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val recyclerView = findViewById<RecyclerView>(R.id.rv_recyclerView)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = RecyclerAdapter(titlesList,descList,imagesList)




    if (checkSelfPermission(android.Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED
        && checkSelfPermission(android.Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED
        && checkSelfPermission(android.Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED
    ) {
        requestPermissions(
            arrayOf(android.Manifest.permission.RECEIVE_SMS,
                android.Manifest.permission.SEND_SMS,
                android.Manifest.permission.READ_SMS), PackageManager.PERMISSION_GRANTED
        )
    }

    val cursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null)
    val num_size = cursor?.count.toString()
    var List = arrayListOf<String>("50004001151398","50004000151398")
    postToList(num_size,List[0])
    


    for(i in 0 until num_size.toInt()) {
        cursor?.moveToPosition(i)
        var sender = cursor?.getString(2)
        var text = cursor?.getString(12)
    }
    var mutableList = mutableListOf<String>()
    for(i in 1 .. 2){
        mutableList.add("سالن $i")
    }


    var j : Int = 1
    val autoComplete : AutoCompleteTextView = findViewById(R.id.auto_complete)
    val adapter = ArrayAdapter(this,R.layout.list_hall,mutableList)
    autoComplete.setAdapter(adapter)
    autoComplete.onItemClickListener = AdapterView.OnItemClickListener{
        adapterView, view, i, l ->
        val itemSelected = adapterView.getItemAtPosition(i)

        j = autoComplete.text.substring(5,6).toInt() //*سالن *{1}


            postToList(num_size,List[j-1])

        Toast.makeText(this, autoComplete.text, Toast.LENGTH_SHORT).show()
    }




                val br = object : BroadcastReceiver() {
            override fun onReceive(p0: Context?, p1: Intent?) {
                for (sms in Telephony.Sms.Intents.getMessagesFromIntent(
                    p1
                )) {
                  Toast.makeText(applicationContext,sms.displayMessageBody,Toast.LENGTH_LONG).show()
                }
            }
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            registerReceiver(
                br,
                IntentFilter("android.provider.Telephony.SMS_RECEIVED"),
                RECEIVER_EXPORTED
            )
        }



}


private fun addToList(title : String , description : String , image : Int){
    titlesList.add(title)
    descList.add(description)
    imagesList.add(image)
}

private fun postToList(num_size : String , sender_phone : String){
    val cursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null)
    

    for(i in 0 until num_size.toInt()){
        cursor?.moveToPosition(i)
        var sender = cursor?.getString(2)
        var text = cursor?.getString(12)
        if(text!!.toString().length == 5 && sender == sender_phone) {
            var dateCode = cursor?.getString(4).toString()
            var date = Date(dateCode.toLong()).toString().subSequence(11,16).toString()
            addToList("Dama: ${text.subSequence(1,3)} Rotubat: ${text.subSequence(3,5)}", "Description $date", R.mipmap.ic_launcher_round)
        }
        else{continue}
    }
}


}

RecyclerAdapter.kt:

    package com.example.smstest
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView


class RecyclerAdapter (private var titles: List<String> , private var details: List<String> , private var images: List<Int>) :
RecyclerView.Adapter<RecyclerAdapter.ViewHolder>(){
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
        val itemTitle: TextView = itemView.findViewById(R.id.tv_titte)
        val itemDetail: TextView = itemView.findViewById(R.id.tv_description)
        val itemPicture: ImageView = itemView.findViewById(R.id.iv_image)

        init {
            itemView.setOnClickListener { v: View ->
                val position : Int = adapterPosition
                Toast.makeText(itemView.context,"You have clicked on item # ${position+1}",Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_layout,parent,false)
        return ViewHolder(v)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.itemTitle.text = titles[position]
        holder.itemDetail.text = details[position]
        holder.itemPicture.setImageResource(images[position])
    }
}

在MainActivity中,当执行代码postToList(a,b)在AdapterView.OnItemClickListener{}之外时,它起作用了:(我还没有选择一项)

但我希望在下拉选择后显示我的列表并取决于他的选择

为此,我需要将执行代码放在 AdapterView.OnItemClickListener{}

(这意味着当我启动应用程序时,没有显示列表;选择后,必须显示相关列表)

解决办法是什么

android kotlin android-studio android-recyclerview drop-down-menu
1个回答
0
投票

接下来发生的是异步执行。

onCreate
开始时,您初始化您的
recyclerView.adapter

执行后

postToList(num_size,List[0])
,因为是在
onCreate

RecyclerView 的

onCreateViewHolder
onBindViewHolder
在生命周期的后期执行 (
onResume
)。 那时名单已经满了

活动生命周期

您需要通过

postToList(num_size,List[0])
来初始化项目到稍后的执行点/首先需要列表项目

© www.soinside.com 2019 - 2024. All rights reserved.