2016-03-16 2 views
1

Я пытаюсь открыть диалоговое окно при щелчке ImageView. Когда изображение щелкнул я получаю следующее сообщение об ошибке:Android - открыть диалоговое окно при нажатии на изображение

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 
                       at il.ac.shenkar.david.todolistex2.InviteMember.onPersonIconClick(InviteMember.java:182) 

Но все объекты инициализируются.

У меня есть отдельный макет для диалога, что я хочу, чтобы открыть:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="200dp" 
    android:orientation="horizontal" 
    android:layout_gravity="center" 
    android:id="@+id/invitememberLayout3"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/emplist_listView" 
     android:layout_centerHorizontal="true" /> 
</LinearLayout> 

я создания экземпляра ImageView следующим образом:

person_img = (ImageView) findViewById(R.id.person_icon); 
    person_img.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      onPersonIconClick(v); 
     } 
    }); 

Это метод onPersonIconClick:

public void onPersonIconClick (View view) 
{ 
    final Dialog d = new Dialog(InviteMember.this); 
    d.setTitle("Employee List"); 
    d.setContentView(R.layout.employeelist); 
    all_emp_list = (ListView) view.findViewById(R.id.emplist_listView); 
    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, emp_List); 
    all_emp_list.setAdapter(adapter); 
    all_emp_list.setVisibility(View.VISIBLE); 
    d.show(); 
} 

Что я здесь делаю неправильно?

ответ

1

What am I doing wrong here?

(ListView) view.findViewById(R.id.emplist_listView);

Эта линия обычно называют на вид, который содержит ListView. Представление, которое вы передаете onPersonIconClick(), не является представлением, содержащим список. Это вместо этого ImageView, что вы нажимаете на и получить ссылку в

public void onClick(View v) { 
    onPersonIconClick(v); 
} 

Так в основном вы звоните findViewById(R.id.emplist_listView); на вашем ImageView.

Возможно, вам захочется сохранить глобальную ссылку на ваш список, чтобы вам не пришлось повторно инициализировать ее в вашем отдельном методе.

+0

Что вы имеете в виду под «глобальной» ссылки? –

+0

@DavidFaiz экземпляр списка, который вы определяете в области действия верхнего уровня, чтобы вы могли использовать внутри метода onclick. –

1

Попробуйте это ...
Вам необходимо раздуть представление, которое вы хотите для своего диалога. и получить ссылку на ваш список из этого раздутого представления.
Если вы не получили ссылку с их завышенного вида или вида, не найдено, то это даст вам NullPointerException.

final Dialog d = new Dialog(InviteMember.this); 
     d.setTitle("Employee List"); 
     View dialogView = LayoutInflater.from(InviteMember.this).inflate(R.layout.employeelist, null); 
     d.setContentView(dialogView); 
     all_emp_list = (ListView) dialogView.findViewById(R.id.emplist_listView); 
     adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, emp_List); 
     all_emp_list.setAdapter(adapter); 
     all_emp_list.setVisibility(View.VISIBLE); 
     d.show(); 
+2

Почему? Что другое и почему? –

+0

Поскольку представление должно найти ссылку из их макета. –

+1

Объясните это в ответе. не просто скомпилируйте код, не сказав ничего об этом –

0

Пошел в более традиционным способом, и положил всю логику в создании AlertDialog:

person_img = (ImageView) findViewById(R.id.person_icon); 
    person_img.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      final Dialog dialog = new Dialog(InviteMember.this); 
      dialog.setContentView(R.layout.employeelist); 
      dialog.setTitle("Employee List"); 
      all_emp_list = (ListView) dialog.findViewById(R.id.emplist_listView); 
      adapter = new ArrayAdapter<String>(InviteMember.this, android.R.layout.simple_spinner_item, emp_List); 
      all_emp_list.setAdapter(adapter); 
      dialog.show(); 
     } 
    }); 
Смежные вопросы