Android Studio中Dog breed API调用无显示问题求助
Hey there! Let's figure out why your dog breed API call isn't showing any content in your Android app. Since you only shared a snippet of your MainActivity, I'll walk through the most common pitfalls and fixes based on typical implementations for this scenario.
1. Missing Network Permissions
Android blocks network access by default if you don't declare the right permissions. Double-check your AndroidManifest.xml to make sure these lines are present:
<uses-permission android:name="android.permission.INTERNET" /> <!-- Optional but helpful for checking network status --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. Making Network Calls on the Main Thread
Android strictly forbids network operations on the main thread (this throws a NetworkOnMainThreadException). You need to use an async approach—here's how to do it with Coroutines (Android's recommended method now):
First, add these dependencies to your module-level build.gradle:
dependencies { // Coroutines for async work implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3' // OkHttp for network requests implementation 'com.squareup.okhttp3:okhttp:4.11.0' // Gson for JSON parsing implementation 'com.google.code.gson:gson:2.10.1' // Glide for image loading implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' }
Then update your MainActivity to use async requests:
data class Product(val breedName: String, val imageUrl: String) class MainActivity : AppCompatActivity() { private lateinit var dogList: ArrayList<Product> private lateinit var listView: ListView private lateinit var adapter: CustomAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Initialize views and adapter listView = findViewById(R.id.your_listview_id) dogList = ArrayList() adapter = CustomAdapter(this, dogList) listView.adapter = adapter // Launch coroutine to fetch data lifecycleScope.launch { try { val rawJson = fetchDogBreedData() parseJsonToProducts(rawJson) adapter.notifyDataSetChanged() // Tell adapter data updated } catch (e: Exception) { e.printStackTrace() Toast.makeText(this@MainActivity, "Failed to load dog breeds", Toast.LENGTH_SHORT).show() } } } // Run network call on background thread private suspend fun fetchDogBreedData(): String { return withContext(Dispatchers.IO) { val client = OkHttpClient() val request = Request.Builder() .url("YOUR_DOG_BREED_API_URL") .build() val response = client.newCall(request).execute() response.body?.string() ?: "" } } // Parse JSON to match your Product class (adjust based on your API's response) private fun parseJsonToProducts(jsonString: String) { val gson = Gson() // Example: If your API returns {"message": {"labrador": ["url1"], ...}} val breedMap = gson.fromJson(jsonString, Map::class.java)["message"] as Map<String, List<String>> breedMap.forEach { (breedName, imageUrls) -> // Grab the first image URL for each breed dogList.add(Product(breedName, imageUrls.firstOrNull() ?: "")) } } }
3. Adapter Not Set Up Correctly
Make sure your CustomAdapter properly binds data to list items. Here's a working example:
class CustomAdapter(context: Context, private val dogBreeds: ArrayList<Product>) : BaseAdapter() { private val inflater = LayoutInflater.from(context) override fun getCount(): Int = dogBreeds.size override fun getItem(position: Int): Any = dogBreeds[position] override fun getItemId(position: Int): Long = position.toLong() override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = convertView ?: inflater.inflate(R.layout.your_list_item_layout, parent, false) val breedNameTv = view.findViewById<TextView>(R.id.breed_name_tv) val dogImageIv = view.findViewById<ImageView>(R.id.dog_image_iv) val currentBreed = dogBreeds[position] breedNameTv.text = currentBreed.breedName // Load image with Glide Glide.with(view.context) .load(currentBreed.imageUrl) .placeholder(R.drawable.placeholder_dog) // Add a placeholder .into(dogImageIv) return view } }
4. Mismatched JSON Parsing
First test your API URL in a browser or Postman to see the exact JSON structure. If your parsing logic doesn't match the API's response (e.g., nested objects vs flat lists), your app won't populate the list. Adjust your data classes to mirror the API's output.
5. Layout Visibility Issues
- Check that your ListView in
activity_main.xmlusesmatch_parentfor width and height (so it's visible on screen). - Verify your list item layout has properly sized TextViews and ImageViews—if they're set to
wrap_contentwith no content, they might appear invisible.
If you're still stuck, share your full MainActivity code, CustomAdapter code, and a sample of the API's JSON response, and we can dig deeper!
内容的提问来源于stack exchange,提问作者Amit

