Обратите внимание, что: я использую Kotlin + Android Studio, последняя версия
Я проверил свой веб -сайт и API через почтальон, и она идеально подходит, поэтому я думаю, что проблема в моем приложении
Вот мой полный код < /p>
admobhelper.kt
Код: Выделить всё
package com.khm.jobstest
import android.app.Activity
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdView
import com.google.android.gms.ads.MobileAds
object AdMobHelper {
fun initializeAdMob(activity: Activity) {
MobileAds.initialize(activity) {}
}
fun loadBannerAd(adView: AdView) {
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
}
}
< /code>
apiservice.kt
package com.khm.jobstest
import retrofit2.Call
import retrofit2.http.GET
interface ApiService {
@GET("jobs/") // Use the correct endpoint
fun getJobs(): Call
}
< /code>
jobadapter.kt
package com.khm.jobstest
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
class JobAdapter(private val jobs: List) :
RecyclerView.Adapter() {
class JobViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val jobImage: ImageView = view.findViewById(R.id.jobImage)
val jobName: TextView = view.findViewById(R.id.jobName)
val jobDetails: TextView = view.findViewById(R.id.jobDetails)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): JobViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_job, parent, false)
return JobViewHolder(view)
}
override fun onBindViewHolder(holder: JobViewHolder, position: Int) {
val job = jobs[position]
holder.jobName.text = job.name
holder.jobDetails.text = job.app_contect
Glide.with(holder.itemView.context).load(job.app_image).into(holder.jobImage)
}
override fun getItemCount(): Int = jobs.size
}
< /code>
Jobmodel.kt
package com.khm.jobstest
data class JobModel(
val name: String,
val app_contect: String,
val app_image: String
)
< /code>
mainactivity.kt
package com.khm.jobstest
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdView
import com.google.android.gms.ads.MobileAds
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var adView: AdView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Initialize RecyclerView
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
// Initialize AdMob
MobileAds.initialize(this) {}
adView = findViewById(R.id.adView)
adView.loadAd(AdRequest.Builder().build())
// Check internet connection
if (!NetworkUtils.isOnline(this)) {
Toast.makeText(this, "يجب أن تستخدم الإنترنت للتصفح، حاول لاحقًا.", Toast.LENGTH_LONG).show()
return
}
// Fetch data from API
val retrofit = Retrofit.Builder()
.baseUrl("https://trainermods.net/api/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
apiService.getJobs().enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful && response.body() != null) {
recyclerView.adapter = JobAdapter(response.body()!!)
} else {
Toast.makeText(this@MainActivity, "البيانات غير صالحة", Toast.LENGTH_SHORT).show()
}
}
override fun onFailure(call: Call, t: Throwable) {
Toast.makeText(this@MainActivity, "فشل تحميل البيانات: ${t.message}", Toast.LENGTH_SHORT).show()
}
})
}
}
< /code>
networkutils.kt
package com.khm.jobstest
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
object NetworkUtils {
fun isOnline(context: Context): Boolean {
val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
}
}
< /code>
Retrofitinstance.kt
package com.khm.jobstest
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitInstance {
private const val BASE_URL = "https://trainermods.net/api/"
val retrofit: Retrofit by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
fun getRetrofitInstance(): Retrofit {
return retrofit
}
}
< /code>
android manifest.xml
< /code>
Aactivity_main.xml
< /code>
item_job.xml
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-the-app