gilllsss
gilllsss

Reputation: 97

How to set List Adapter in onPostExecute Asynctask?

Good Day everyone,

I have some problem here. I make a web service call in AsyncTask DoInBackground.

And I wanted to set list adapter, but I got error

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

Now how to set list adapter in post execute or something?

My code

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);
    progressBar = (ProgressBar)findViewById(R.id.prgLoading);


     //Initialize the ListView
    final ListView lvProf = (ListView)findViewById(R.id.lvProfile);

    //call the asynctask cals and add item to the list.
    new LoadDataForActivity().execute();

   //Set adapter , but i got error here
    lvProf.setAdapter(new ListProfileAdapter(this,mItems));



}

private class LoadDataForActivity extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        progressBar.setVisibility(View.VISIBLE);
        progressBar.setIndeterminate(false);
        progressBar.setClickable(false);
    }
    @Override
    protected Void doInBackground(Void... params) {

        getAll();
        getTotalLeaveBalance();
        getMedicalBalance();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
    //here is I add the item to my list (mitems)
        try{
            ResponseServiceMedicalBalance = ResponseServiceMedicalBalance.replace("\\\"", "\"");
            ResponseServiceMedicalBalance = ResponseServiceMedicalBalance.substring(1, ResponseServiceMedicalBalance.length() - 1);

            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObject = (JSONObject) jsonParser.parse(ResponseServiceMedicalBalance);
            String Status = jsonObject.get("Status").toString();

            if (Status == "true") {
                // JSONArray structure = (JSONArray) jsonObject.get("DataList");
                String dataku = jsonObject.get("DataList").toString();
                mItems = new ArrayList<ListProfileItem>();
                try {
                    dataku = ANGGACRYYPT.decrypt(Enc_Pass, dataku);
                }catch (GeneralSecurityException e){
                    //handle error - could be due to incorrect password or tampered encryptedMsg
                }

                JSONParser parser = new JSONParser();
                JSONArray structure = (JSONArray) parser.parse(dataku);
                for (int i = 0; i < structure.size(); i++) {
                    JSONObject data = (JSONObject) structure.get(i);
                    item = new ListProfileItem();
                    item.claimpostname = data.get("claim_post_name").toString();
                    String claimamount = data.get("max_limit_per_year").toString();
                    if (claimamount!=("0.0"))
                    {
                        Double amount = Double.parseDouble(claimamount);
                        DecimalFormat formatter = new DecimalFormat("#,###.00");
                        String AmountFormatted = formatter.format(amount);
                        item.claimpostamount = AmountFormatted;
                    }
                    else
                    {
                        item.claimpostamount = data.get("max_limit_per_year").toString();
                    }
                    mItems.add(item);
                }
                // initialize and set the list adapter

            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

}

Upvotes: 2

Views: 2164

Answers (4)

sreejith v s
sreejith v s

Reputation: 1334

Initialise mItems as

mItems = new ArrayList<>();

Create object for ListProfileAdapter

ListProfileAdapter adapter =  new ListProfileAdapter(this,mItems);
lvProf.setAdapter(adapter);

Add items in mItems

mItems.add(item);

After all items added to the list notify the adapter

adapter.notifyDataSetChanged(); 

Upvotes: 1

sadat
sadat

Reputation: 4342

I think the following line should be before setting your adapter,

mItems = new ArrayList<ListProfileItem>();
adapter = new ListProfileAdapter(this,mItems)
lvProf.setAdapter(adapter);

Make the instance variable,

ListProfileAdapter adapter;

instead of putting in the Asynctask. After finishing the asynctask in onPostExecute you also need to run,

adapter.notifyDatasetChanged();

Upvotes: 0

Manikanta
Manikanta

Reputation: 3421

There are several ways of solving this, One of the quick and dirtiest is:

Change your AsyncTaskActivity Like this:

private class LoadDataForActivity extends AsyncTask<Void, Void, Void> {


  private ListView listView;

  private Context context;

  public LoadDataForActivity(ListView listView,Context context){
    this. listView = listView;
    this.context = context;
  }

    @Override
    protected void onPreExecute() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        progressBar.setVisibility(View.VISIBLE);
        progressBar.setIndeterminate(false);
        progressBar.setClickable(false);
    }
    @Override
    protected Void doInBackground(Void... params) {

        getAll();
        getTotalLeaveBalance();
        getMedicalBalance();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
    //here is I add the item to my list (mitems)
        try{
            ResponseServiceMedicalBalance = ResponseServiceMedicalBalance.replace("\\\"", "\"");
            ResponseServiceMedicalBalance = ResponseServiceMedicalBalance.substring(1, ResponseServiceMedicalBalance.length() - 1);

            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObject = (JSONObject) jsonParser.parse(ResponseServiceMedicalBalance);
            String Status = jsonObject.get("Status").toString();

            if (Status == "true") {
                // JSONArray structure = (JSONArray) jsonObject.get("DataList");
                String dataku = jsonObject.get("DataList").toString();
                mItems = new ArrayList<ListProfileItem>();
                try {
                    dataku = ANGGACRYYPT.decrypt(Enc_Pass, dataku);
                }catch (GeneralSecurityException e){
                    //handle error - could be due to incorrect password or tampered encryptedMsg
                }

                JSONParser parser = new JSONParser();
                JSONArray structure = (JSONArray) parser.parse(dataku);
                for (int i = 0; i < structure.size(); i++) {
                    JSONObject data = (JSONObject) structure.get(i);
                    item = new ListProfileItem();
                    item.claimpostname = data.get("claim_post_name").toString();
                    String claimamount = data.get("max_limit_per_year").toString();
                    if (claimamount!=("0.0"))
                    {
                        Double amount = Double.parseDouble(claimamount);
                        DecimalFormat formatter = new DecimalFormat("#,###.00");
                        String AmountFormatted = formatter.format(amount);
                        item.claimpostamount = AmountFormatted;
                    }
                    else
                    {
                        item.claimpostamount = data.get("max_limit_per_year").toString();
                    }
                    mItems.add(item);
                }

    listView.setAdapter(new ListProfileAdapter(context,mItems));


            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
  }

And you can call the asyncTask like this:

new LoadDataForActivity(listView,this).execute();

Upvotes: 2

Elias Fazel
Elias Fazel

Reputation: 2113

move it from onCreate to onPostExecute() define instance of Adapter as global variable then add Items in doInBackground() & call setAdapter onPostExec.

 //Set adapter , but i got error here >> move it to onPostExecute
    lvProf.setAdapter(new ListProfileAdapter(this,mItems));

Upvotes: 0

Related Questions