setAdapter显示NullPointerExeption

时间:2016-03-27 07:00:38

标签: android listview dialog

我想打开一个对话框供用户从多个项目中进行选择,但是当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处于Dialog布局中。什么错在这里?

4 个答案:

答案 0 :(得分:1)

您的代码中只有两个错误,您在调用此行而不使用cd.作为前缀,因此您必须这样做,

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

您正在做的另一个错误是在致电findViewById之前致电setContentView(),这也可能会提升NPE。

所以我建议你把它移动起来并像这样重新安排

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

答案 1 :(得分:0)

问题是,当您在其上调用listView时,您的变量setAdapter()为null。因此,对findViewById()的调用返回null。也许你只是使用了错误的ID。

答案 2 :(得分:0)

你有一些基本的错误。 主要的错误是在代码末尾调用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);

答案 3 :(得分:0)

只需在onClick侦听器之外初始化listview。 在onCreate()中初始化它是更可取的。

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