Mayank Aggarwal
Mayank Aggarwal

Reputation: 161

Populating items in dialog box with data fetched using Volley

I am fetching the data from a phpmysql database using Volley. Now, whenever I click the button to display the dialog box, my app crashes with this error:

Error I am getting

What is the problem?

Here's my code:

public class SetTask extends Fragment {

ListView lv_task_chooser;
ArrayList<SetTaskModel> setTaskModelArrayList;
private SetTaskAdapter setTaskAdapter;
ArrayAdapter<String> scAdapter;
String url, category;
RequestQueue queue_fetch, queue_fetch1;
ConnectivityManager connMgr;
NetworkInfo networkInfo;
Context ctx;
int cat_id;
LinearLayout taskLayout;
private String[] array;
private int[] sub_cat_id;
JSONArray jsonArray, jsonArray1;

public SetTask() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_set_task, container, false);

    ctx = getContext();

    lv_task_chooser = (ListView)rootView.findViewById(R.id.lv_task_chooser);
    taskLayout = (LinearLayout)rootView.findViewById(R.id.taskLayout);

    queue_fetch = Volley.newRequestQueue(ctx);
    queue_fetch1 = Volley.newRequestQueue(ctx);

    setTaskModelArrayList = new ArrayList<>();

    fetchDB();

    Log.i("pointafterfetch", "reached");
    Log.i("numberofarrayentries", String.valueOf(setTaskModelArrayList.size()));

    for (int i = 0; i < setTaskModelArrayList.size(); i++){
        Log.i("arrayentriesfetch", setTaskModelArrayList.get(i).toString());
    }

    //setTaskAdapter = new SetTaskAdapter(setTaskModelArrayList, ctx);
    //lv_task_chooser.setAdapter(setTaskAdapter);

    /*lv_task_chooser.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            populateSpinner(position);
        }
    });*/

    return rootView;
}

private void fetchDB(){

    url = "http://nmstech.in/coach/categorys.php";

    connMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    networkInfo = connMgr.getActiveNetworkInfo();

    if (!(networkInfo != null && networkInfo.isConnected())) {
        final AlertDialog.Builder builder1 = new AlertDialog.Builder(ctx);
        builder1.setTitle(getString(R.string.network_no_t));
        builder1.setMessage(getString(R.string.network_no_m));
        builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        builder1.create().show();
    }

    else{

        StringRequest strreq_fetch = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {

                    @Override
                    public void onResponse(String Response) {
                        try {
                            jsonArray = new JSONArray(Response);

                            for(int i = 0; i < jsonArray.length(); i++){

                                setTaskModelArrayList.add(new SetTaskModel(jsonArray.getJSONObject(i)
                                        .getString("cat_name")));
                                Log.i("arraylistentries", setTaskModelArrayList.get(i).getCategory());
                                Log.i("noentries", String.valueOf(setTaskModelArrayList.size()));

                                setTaskAdapter = new SetTaskAdapter(setTaskModelArrayList, ctx);
                                lv_task_chooser.setAdapter(setTaskAdapter);
                                setTaskAdapter.notifyDataSetChanged();

                                lv_task_chooser.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                    @Override
                                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                        populateSpinner(position);
                                    }
                                });
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError e) {
                e.printStackTrace();
            }
        });

        Log.i("pointnotesfetch", "reached");
        queue_fetch.add(strreq_fetch);
    }
}

private void populateSpinner(final int position){

    url = "http://nmstech.in/coach/categorys.php";

    connMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    networkInfo = connMgr.getActiveNetworkInfo();

    if (!(networkInfo != null && networkInfo.isConnected())) {
        final AlertDialog.Builder builder1 = new AlertDialog.Builder(ctx);
        builder1.setTitle(getString(R.string.network_no_t));
        builder1.setMessage(getString(R.string.network_no_m));
        builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        builder1.create().show();
    }

    else {
        Log.i("spinpop", "reached");
        StringRequest strreq_fetch1 = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String Response) {
                        try {
                            cat_id = (int) lv_task_chooser.getItemIdAtPosition(position);

                            jsonArray1 = new JSONArray(Response);

                            final AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
                            builder.setTitle("Subtopics");

                            connMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
                            networkInfo = connMgr.getActiveNetworkInfo();

                            category = jsonArray1.getJSONObject(cat_id).getString("cat_name");

                            int k = 0;

                            try {
                                   for (int i = 0; i < jsonArray1.getJSONObject(position).getJSONArray("sub_cat").length(); i++){

                                    array = new String[jsonArray1.getJSONObject(position).getJSONArray("sub_cat").length()];
                                    sub_cat_id = new int[jsonArray1.getJSONObject(position).getJSONArray("sub_cat").length()];

                                    array[i] = jsonArray1.getJSONObject(position).getJSONArray("sub_cat").getJSONObject(i).getString("sub_cat_name");
                                    sub_cat_id[k++] = jsonArray1.getJSONObject(position).getJSONArray("sub_cat").getJSONObject(i).getInt("sub_cat_id");
                                    Log.i("sub_cat_id", String.valueOf(sub_cat_id[k-1]));
                                    Log.i("sub_cat", array[i]);
                                }

                                scAdapter = new ArrayAdapter<String>(ctx, android.R.layout.simple_spinner_dropdown_item, array);
                            }
                            catch (Exception e){
                                e.printStackTrace();
                            }

                            builder.setItems(array, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();

                                    Bundle cat_args = new Bundle();
                                    cat_args.putInt("sub_cat_id", sub_cat_id[which]);
                                    cat_args.putString("sub_cat", array[which]);

                                    Fragment fragment = new Exercise();
                                    FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
                                    fragment.setArguments(cat_args);
                                    fragmentTransaction.replace(R.id.mainFrame, fragment);
                                    fragmentTransaction.commit();
                                }
                            });

                            builder.show();

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError e) {
                e.printStackTrace();
            }
        });

        Log.i("pointnotesfetch", "reached");
        queue_fetch1.add(strreq_fetch1);
    }
}
}

EDIT: Adding full stacktrace

06-29 10:38:25.499 9183-9183/nmss.example.com.coach E/AndroidRuntime: FATAL EXCEPTION: main Process: nmss.example.com.coach, PID: 9183 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:409) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:371) at android.widget.AbsListView.obtainView(AbsListView.java:2367) at android.widget.ListView.measureHeightOfChildren(ListView.java:1326) at android.widget.ListView.onMeasure(ListView.java:1233) at android.view.View.measure(View.java:19756) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:19756) at android.support.v7.widget.AlertDialogLayout.tryOnMeasure(AlertDialogLayout.java:135) at android.support.v7.widget.AlertDialogLayout.onMeasure(AlertDialogLayout.java:63) at android.view.View.measure(View.java:19756) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at android.view.View.measure(View.java:19756) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:19756) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:19756) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) at android.view.View.measure(View.java:19756) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6124) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:687) at android.view.View.measure(View.java:19756) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2283) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1343) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1258) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6348) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) at android.view.Choreographer.doCallbacks(Choreographer.java:683) at android.view.Choreographer.doFrame(Choreographer.java:619) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

EDIT 2:

Adding code for SetTaskAdapter class

public class SetTaskAdapter extends ArrayAdapter<SetTaskModel>{

private ArrayList<SetTaskModel> data;
Context mContext;

private static class ViewHolder{

    Button btn_category;
}

public SetTaskAdapter(ArrayList<SetTaskModel> data, Context mContext){

    super(mContext, R.layout.lv_task_chooser, data);
    this.data = data;
    this.mContext = mContext;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    SetTaskModel setTaskModel = getItem(position);
    ViewHolder viewHolder;
    final View result;

    if(convertView == null){
        viewHolder = new ViewHolder();
        LayoutInflater layoutInflater = LayoutInflater.from(getContext());
        convertView = layoutInflater.inflate(R.layout.lv_task_chooser, parent, false);

        viewHolder.btn_category = (Button)convertView.findViewById(R.id.btn_category);


        result = convertView;

        convertView.setTag(viewHolder);
    }

    else{
        viewHolder = (ViewHolder)convertView.getTag();
        result = convertView;
    }

    viewHolder.btn_category.setText(setTaskModel.getCategory());

    return convertView;
}
}

Upvotes: 0

Views: 550

Answers (1)

Krish
Krish

Reputation: 3885

Try this code , Initialize the string array and int array out side of your for loop.

Example:

        array = new String[jsonArray1.getJSONObject(position).getJSONArray("sub_cat").length()];
        sub_cat_id = new int[jsonArray1.getJSONObject(position).getJSONArray("sub_cat").length()];

        try {
            for (int i = 0; i < jsonArray1.getJSONObject(position).getJSONArray("sub_cat").length(); i++){
                array[i] = jsonArray1.getJSONObject(position).getJSONArray("sub_cat").getJSONObject(i).getString("sub_cat_name");
                sub_cat_id[k++] = jsonArray1.getJSONObject(position).getJSONArray("sub_cat").getJSONObject(i).getInt("sub_cat_id");
                Log.i("sub_cat_id", String.valueOf(sub_cat_id[k-1]));
                Log.i("sub_cat", array[i]);
            }

            scAdapter = new ArrayAdapter<String>(ctx, android.R.layout.simple_spinner_dropdown_item, array);
        }
        catch (Exception e){
            e.printStackTrace();
        }

Upvotes: 0

Related Questions