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{}
中(这意味着当我启动应用程序时,没有显示列表;选择后,必须显示相关列表)
解决办法是什么
接下来发生的是异步执行。
在
onCreate
开始时,您初始化您的 recyclerView.adapter
执行后
postToList(num_size,List[0])
,因为是在onCreate
RecyclerView 的
onCreateViewHolder
和 onBindViewHolder
在生命周期的后期执行 (onResume
)。
那时名单已经满了
您需要通过
postToList(num_size,List[0])
来初始化项目到稍后的执行点/首先需要列表项目