当前位置: 首页 > 知识库问答 >
问题:

使用截取的数据填充对话框中的项目

东门令
2023-03-14

我正在使用截取从phpmysql数据库获取数据。现在,每当我单击按钮显示对话框时,我的应用程序都会因以下错误而崩溃:

我得到的错误

问题是什么?

这是我的代码:

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);
    }
}
}

编辑:添加完整stacktrace

06-29 10:38:25.499 9183-9183/网管系统。实例com。coach E/AndroidRuntime:致命异常:主进程:nmss。实例com。coach,PID:9183 java。lang.NullPointerException:尝试调用虚拟方法“java”。lang.字符串java。lang.Object。android上的空对象引用上的toString()。小部件。阵列适配器。在android上创建ViewFromResource(ArrayAdapter.java:409)。小部件。阵列适配器。android上的getView(ArrayAdapter.java:371)。小部件。AbsListView。android上的获取视图(AbsListView.java:2367)。小部件。ListView。android上的measureHeightOfChildren(ListView.java:1326)。小部件。ListView。android上的onMeasure(ListView.java:1233)。看法看法在android上测量(View.java:19756)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:6124)。小部件。框架布局。android上的onMeasure(FrameLayout.java:185)。看法看法在android上测量(View.java:19756)。支持v7.widget。AlertDialogLayout。android上的tryOnMeasure(AlertDialogLayout.java:135)。支持v7.widget。AlertDialogLayout。android上的onMeasure(AlertDialogLayout.java:63)。看法看法在android上测量(View.java:19756)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:6124)。小部件。框架布局。android上的onMeasure(FrameLayout.java:185)。支持v7.widget。ContentFrameLayout。android上的onMeasure(ContentFrameLayout.java:139)。看法看法在android上测量(View.java:19756)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:6124)。小部件。框架布局。android上的onMeasure(FrameLayout.java:185)。看法看法在android上测量(View.java:19756)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:6124)。小部件。框架布局。android上的onMeasure(FrameLayout.java:185)。看法看法在android上测量(View.java:19756)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:6124)。小部件。线性布局。android上的measureChildBeforeLayout(LinearLayout.java:1464)。小部件。线性布局。android上的measureVertical(LinearLayout.java:758)。小部件。线性布局。android上的onMeasure(LinearLayout.java:640)。看法看法在android上测量(View.java:19756)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:6124)。小部件。框架布局。com上的onMeasure(FrameLayout.java:185)。Android内部的政策DecorView。android上的onMeasure(DecorView.java:687)。看法看法在android上测量(View.java:19756)。看法ViewRootImpl。android上的performMeasure(ViewRootImpl.java:2283)。看法ViewRootImpl。android上的measureHierarchy(ViewRootImpl.java:1343)。看法ViewRootImpl。在android上执行Traversals(ViewRootImpl.java:1619)。看法ViewRootImpl。android上的doTraversal(ViewRootImpl.java:1258)。看法ViewRootImpl$TraversalRunnable。在android上运行(ViewRootImpl.java:6348)。看法Choreographer$CallbackRecord。在android上运行(Choreographer.java:871)。看法编舞android上的doCallbacks(Choreographer.java:683)。看法编舞android上的doFrame(Choreographer.java:619)。看法Choreographer$FrameDisplayEventReceiver。在android上运行(Choreographer.java:857)。操作系统。处理程序。android上的handleCallback(Handler.java:751)。操作系统。处理程序。android上的dispatchMessage(Handler.java:95)。操作系统。活套。android上的loop(Looper.java:154)。应用程序。ActivityThread。java上的main(ActivityThread.java:6123)。lang.reflect。方法在com上调用(本机方法)。Android内部的操作系统。ZygoteInit$MethodandArgscaler。在com上运行(ZygoteInit.java:867)。Android内部的操作系统。合子岩。main(ZygoteInit.java:757)

编辑2:

添加SetTaskAdapter类的代码

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;
}
}

共有1个答案

壤驷安和
2023-03-14

尝试以下代码,在for循环的外侧初始化字符串数组和int数组。

示例:

        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();
        }
 类似资料:
  • 拦截对话框 bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndir

  • 问题内容: 我对Flask框架相当陌生,并且正在为Webportal创建编辑配置文件页面。我被困在某个位置,无法自动填写表格。 这是我的表格课: 这是我评估表格的功能。 而我的html表单模板是: 我有一个用户类的对象。然后我要从该对象中预填此表单。如何预填充表单中的值。我正在尝试在此处实现编辑配置文件功能。 问题答案: 创建对象时,需要将其传递给表单。 你将遇到一些麻烦 它创建EditProfi

  • 问题内容: 创建给定大小的零填充熊猫数据框的最佳方法是什么? 我用过了: 有更好的方法吗? 问题答案: 您可以尝试以下方法:

  • 我在NetBeans IDE中工作,语言是Java,主要的类是JFrame Form。 我需要从Jtable获取所有数据并用这些数据填充数组。数组代表矩阵。 代码如下 我有一个错误 线程“AWT-EventQueue-0”java.lang.ClassCastException:java.lang.String无法转换为java.lang.Double 所以将表中的元素设置为双精度不是那么容易吗?

  • 说到编程或java,我只是一个完全的初学者。所以一开始,我的计划是使用JavaFX(结合场景构建器)创建一个窗口,在那里我有一个按钮,可以引导我进入另一个窗口,在那里我有一个组合框。我谷歌了几个小时,想找到一种方法来填充组合框,但我找到的所有解决方案都不适合我。这就是为什么我认为我在这里犯了一些错误,我希望你能以某种方式帮助我。或者在列表中给我一个提示,我应该学习/阅读什么才能自己找到解决方案。首

  • 我想在一个组合框中填充一些数据。这很好。但是,我想动态地改变组合框中的数据。 目前我有一个表,在组合框中,我在表列中显示数据的唯一值。现在,表数据存储在静态可观察列表变量中。我想根据表中显示的数据更改组合框中的数据。也就是说,如果存储表数据的静态可观察列表发生更改,我希望在没有手动干预的情况下更改组合框数据。 如果没有单独的静态变量用于组合框,这是否可能?