【问题标题】:setAdapter is showing NullPointerExceptionsetAdapter 显示 NullPointerException
【发布时间】:2016-03-27 07:00:38
【问题描述】:

我想打开一个对话框供用户从多个项目中进行选择,但是当 setAdapter() 将要执行时出现错误...

button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Dialog cd = new Dialog(Main1.this);

                String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry","WebOS","Ubuntu","Windows7","Max OS X"};

                ArrayAdapter adapter = new ArrayAdapter<String>(cd.getContext(), R.layout.lvlayout, mobileArray);

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

                 listView.setAdapter(adapter);


                cd.setContentView(R.layout.dialogLayout);
                cd.setTitle("MEOW");
                cd.show();

            }
        });

ListView 处于对话框布局中。怎么了?

【问题讨论】:

  • 然后使用ListView listView = (ListView) cd.findViewById(R.id.listviewID);
  • @ShreeKrishna 我做了但没用。
  • 你能检查一下这个listview with in alert dialog
  • 然后尝试向上移动cd.setContentView
  • 你能把日志贴在这里吗?

标签: android listview dialog


【解决方案1】:

只是你的代码有两个错误,你在调用这一行时没有在它前面加上cd.,所以你必须这样做,

ListView listView = (ListView) cd.findViewById(R.id.listviewID);

你犯的另一个错误是在调用setContentView()之前调用findViewById,这也可能引发NPE。

所以我建议你把它向上移动并像这样重新排列

cd.setContentView(R.layout.dialogLayout);
ListView listView = (ListView) cd.findViewById(R.id.listviewID);

【讨论】:

    【解决方案2】:

    问题是你的变量listView null 是当你调用setAdapter() 时。所以对findViewById() 的调用返回null。也许您只是使用了错误的 ID。

    【讨论】:

      【解决方案3】:

      只需在 onClick 侦听器之外初始化您的列表视图。 在 onCreate() 中初始化更可取。

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.layout);
          // initialize
          ListView listView = (ListView) findViewById(R.id.listviewID);
      }
      

      【讨论】:

        【解决方案4】:

        这里有一些基本错误。 主要错误是在代码末尾调用cd.setContentView(R.layout.dialogLayout);。您需要先致电,然后才能在该内容布局中找到某些内容。

        另一个错误是试图找到列表。您需要获取一个视图才能在该视图中找到列表。这可能是这样的。

        ListView listView = (ListView) cd.getView().findViewById(R.id.listviewID);
        

        但是,对于您的问题,我更喜欢以下解决方案。对于您要实现的目标,这可能是一种更简单的方法。

        这是实现自定义对话的一个很好的示例。你可以看看这里。 https://github.com/afollestad/material-dialogs

        所以,现在你得到NullPointerException,我猜findViewById 没有返回你的ListView 的任何引用。所以在这里通过使用上面提到的库,你可以很容易地实现这一点。

        // Initialize your dialogue
        MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
                        .title("MEOW")
                        .customView(R.layout.dialogLayout, true)
                        .positiveText(R.string.ok)
                        .negativeText(R.string.cancel)
                        .onNegative(new MaterialDialog.SingleButtonCallback() {
                            @Override
                            public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
        
        // Now get the view of that dialogue. 
        View view = dialog.getCustomView();
        
        // Initialize the array adapter
        String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry","WebOS","Ubuntu","Windows7","Max OS X"};
        ArrayAdapter adapter = new ArrayAdapter<String>(cd.getContext(), R.layout.lvlayout, mobileArray);
        
        // Get the list view and set the adapter 
        ListView listView = (ListView) view.findViewById(R.id.listviewID);
        listView.setAdapter(adapter);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-05
          • 2015-10-10
          • 1970-01-01
          相关资源
          最近更新 更多