You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android跨类填充ListView问题:质数列表无法显示求助

Hey there! Let's troubleshoot why your prime number ListView isn't showing up. From what you described, it sounds like your ArrayList is populated but isn't properly binding to the ListView. Here are the most common fixes and checks to resolve this:

Key Issues to Check & Fixes

1. You're not using an Adapter (or using it incorrectly)

ListView relies on an Adapter to connect your data to the UI. If you just have a populated ArrayList in your PrimeNumbers class but don't link it to an Adapter, the ListView will stay empty.

Example of a Correct Adapter Setup

In your PrimeNumbersActivity's onCreate method:

// First, get your populated prime list (make sure you're getting the right instance!)
ArrayList<Integer> primeList = getIntent().getIntegerArrayListExtra("POPULATED_PRIMES");

// Get reference to your ListView from the layout
ListView primeListView = findViewById(R.id.your_listview_id);

// Create an ArrayAdapter to bind data to the ListView
ArrayAdapter<Integer> adapter = new ArrayAdapter<>(this, 
    android.R.layout.simple_list_item_1, // Default layout for list items
    primeList
);

// Attach the adapter to the ListView
primeListView.setAdapter(adapter);

2. You're passing the wrong PrimeNumbers instance to the Activity

This is a super common mistake! If you populate a PrimeNumbers object in one place, but create a new empty instance in PrimeNumbersActivity, you'll end up with an empty list.

Fix: Pass the populated list via Intent

When launching PrimeNumbersActivity from your Handler:

// Assume you have a populated PrimeNumbers object
PrimeNumbers primes = new PrimeNumbers();
primes.populatePrimeList(); // Your method to fill the ArrayList

// Launch the Activity and pass the list via Intent
Intent intent = new Intent(YourCurrentActivity.this, PrimeNumbersActivity.class);
intent.putIntegerArrayListExtra("POPULATED_PRIMES", primes.primeNumbers);
startActivity(intent);

Then in PrimeNumbersActivity, retrieve the list using getIntent().getIntegerArrayListExtra("POPULATED_PRIMES") (like in the adapter example above).

3. You're launching the Activity before the list is populated

If your prime calculation runs in a background thread, make sure you wait for it to finish before starting the Activity. If you launch the Activity while the list is still being filled, it'll be empty when the Adapter loads.

Fix: Wait for background work to complete

// Example: Calculate primes in a background thread, then launch Activity on UI thread
new Thread(() -> {
    PrimeNumbers primes = new PrimeNumbers();
    primes.populatePrimeList(); // Do your prime calculation here

    // Switch back to UI thread to start the Activity
    runOnUiThread(() -> {
        Intent intent = new Intent(MainActivity.this, PrimeNumbersActivity.class);
        intent.putIntegerArrayListExtra("POPULATED_PRIMES", primes.primeNumbers);
        startActivity(intent);
    });
}).start();

4. Your ListView isn't properly referenced in the layout

Double-check that your PrimeNumbersActivity layout has a ListView with the correct ID, and that you're using that exact ID in findViewById.

Example layout snippet:

<ListView
    android:id="@+id/your_listview_id"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

5. If updating the list after setting the Adapter, notify the Adapter

If you ever need to add items to the list after the Adapter is already set, you must call:

adapter.notifyDataSetChanged();

This tells the ListView to refresh and show the new data.

Quick Full Example Recap
  1. PrimeNumbers Class (with population logic):
public class PrimeNumbers {
    public ArrayList<Integer> primeNumbers = new ArrayList<>();

    public void populatePrimeList(int limit) {
        // Simple prime generation logic
        for (int num = 2; num <= limit; num++) {
            if (isPrime(num)) {
                primeNumbers.add(num);
            }
        }
    }

    private boolean isPrime(int num) {
        if (num <= 1) return false;
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
}
  1. Launching the Activity:
// In your Handler or background thread
new Handler(Looper.getMainLooper()).post(() -> {
    PrimeNumbers primes = new PrimeNumbers();
    primes.populatePrimeList(100); // Generate primes up to 100
    Intent intent = new Intent(MainActivity.this, PrimeNumbersActivity.class);
    intent.putIntegerArrayListExtra("POPULATED_PRIMES", primes.primeNumbers);
    startActivity(intent);
});
  1. PrimeNumbersActivity:
public class PrimeNumbersActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_prime_numbers);

        ListView primeListView = findViewById(R.id.your_listview_id);
        ArrayList<Integer> primeList = getIntent().getIntegerArrayListExtra("POPULATED_PRIMES");

        if (primeList != null && !primeList.isEmpty()) {
            ArrayAdapter<Integer> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, primeList);
            primeListView.setAdapter(adapter);
        } else {
            // Handle empty list case (show a message)
            TextView emptyState = new TextView(this);
            emptyState.setText("No primes found!");
            emptyState.setGravity(Gravity.CENTER);
            ((ViewGroup) primeListView.getParent()).addView(emptyState);
            primeListView.setEmptyView(emptyState);
        }
    }
}

Start by verifying if you're passing the populated list correctly to the Activity—this is the most likely culprit!

内容的提问来源于stack exchange,提问作者Mohamed Najb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:42:21