首页 > 解决方案 > Fill a listview from a different class android

问题描述

I want to fill and show a listview of the prime numbers.The arraylist of the PrimeNumbers class seems to be filled but when I want to assign it to the listview it won't work.

The problem is when the PrimeNumbersActivity is called from the handler the listview is not filled and nothing is showing in the new activity. Would really appreciate some help.

PrimeNumbers Class

public class PrimeNumbers {

public ArrayList<Integer> primeNumbers = new ArrayList<>();
public PrimeNumbers(ArrayList<Integer> primeNumbers){
    this.primeNumbers = primeNumbers;
}

public PrimeNumbers() {

}

}

Handler class

public class MyHandler extends Handler {
ProgressDialog progressDialog;
Context context;

public MyHandler(ProgressDialog progressDialog, Context context) {
    this.progressDialog = progressDialog;
    this.context = context;
}



@Override
public void handleMessage(Message msg) {
    findPrimeNumber(Integer.parseInt(msg.obj.toString()));
}

public void findPrimeNumber(int number){

    ArrayList<Integer> primeNumbers = new ArrayList<>();
    boolean isPrimeNumber;
    PrimeNumbers primeNumbers1 = new PrimeNumbers(primeNumbers);




    for(int i = 2; i <= number; i++){
        isPrimeNumber = true;
        for(int j = 1; j <= i; j++){
            try {
                sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(j != 1 && j != i){
                if(i%j == 0){
                    isPrimeNumber = false;
                    break;
                }
            }
        }
        if(isPrimeNumber){
            primeNumbers.add(i);
        }
        progressDialog.setProgress(i*100/number);
        if(progressDialog.getProgress() == progressDialog.getMax()){
            progressDialog.dismiss();
            Intent intent = new Intent(context.getApplicationContext(),PrimeNumbersActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }

    for (int i :
            primeNumbers1.primeNumbers) {
        Log.d(TAG, i + "");
    }
}

}

PrimeNumbersActivity class

public class PrimeNumbersActivity extends AppCompatActivity {

private PrimeNumbers primeNumbers = new PrimeNumbers();
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_prime_numbers);

    listView = (ListView) findViewById(R.id.list1);

    ArrayAdapter<Integer> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_2, primeNumbers.primeNumbers);
    listView.setAdapter(arrayAdapter);

}

}

标签: androidlistviewarraylist

解决方案


You can try anyone,

1.use putExtra(),

intent.putExtra("ARRAYLIST",(Serializable) primeNumbers);

In your activity, change this line

ArrayAdapter<Integer> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_2, (ArrayList<Integer>) getIntent().getSerializableExtra("ARRAYLIST"));

2.Use singleton class

public class PrimeNumbers {
private static PrimeNumbers primenumbersOBJ=new PrimeNumbers();
public ArrayList<Integer> primeNumbersArray = new ArrayList<>();
public static PrimeNumbers getInstance(){
    return primenumbersOBJ;
}

private PrimeNumbers() {

}

In Handler class, before starting intent

PrimeNumbers.getInstance().primeNumbersArray=resultarray;

In your activity, use

PrimeNumbers.getInstance().primeNumbersArray

推荐阅读