2016-12-29 4 views
-1

Вызванные: java.lang.NullPointerException: Попытка вызвать виртуальный метод «недействительный android.widget.ListView.setAdapter (android.widget.ListAdapter)» на нулевую ссылке на объектNullpointerexception в диалоговом окне?

У меня есть обычай dialog содержащего ViewPager, содержащий уникальную listview, однако я получаю NullPointerException при попытке установить мой ArrayAdapter:

dialog = new Dialog(this); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.voicedialog); 
    dialog.setCanceledOnTouchOutside(false); 

    dialog.getWindow().setLayout((int)(getResources().getDisplayMetrics().widthPixels*0.90), (int)(getResources().getDisplayMetrics().heightPixels*0.90)); 

    adapter = new MyPageAdapter(this); 
    pager = (ViewPager) dialog.findViewById(R.id.viewpager); 

    pager.setOffscreenPageLimit(3); 
    pager.setAdapter(adapter); 

    dialog.show(); 

    if(pager.getCurrentItem()==0) { //If on first page of viewpager in dialog (this layout contains the listview) 
     arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, contactArrayList); 
     listview = (ListView) dialog.findViewById(R.id.listView); 
     listview.setAdapter(arrayAdapter); 
     listview.setEmptyView(dialog.findViewById(R.id.emptyElement)); 
     arrayAdapter.notifyDataSetChanged(); 
    } 

Опять же, ListView находится в одном из макетов в моем ViewPager в диалоге моего, с идентификатором listView

Мой вопрос в том, почему список выглядит как null, хотя я четко ссылаюсь на него в приведенном выше коде и как я могу решить эту проблему?

Спасибо за ваше драгоценное время.

EDIT:

VoiceDialog:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

    android:background="@drawable/round" 

    tools:context="..."> 



<android.support.v4.view.ViewPager 
    android:id="@+id/viewpager" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

    </RelativeLayout> 

Есть три макеты XML, которые входят в ViewPager, но один с ListView является первой страницей, поэтому я ставлю этот код в if(pager.getCurrentItem()==0).

Вот ViewPagerAdapter:

public class MyPageAdapter extends PagerAdapter { 

    private Context mContext; 
    LayoutInflater inflater; 

    public MyPageAdapter(Context context) { 
     mContext = context; 
     inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 



    public Object instantiateItem(ViewGroup collection, int position) { 

     View view = null; 

     if(position==0) { 
      view = inflater.inflate(R.layout.voice1, null); 
      collection.addView(view); 
     }if(position==1) { 
      view = inflater.inflate(R.layout.voice2, null); 
      collection.addView(view); 
     }if(position==2) { 
      view = inflater.inflate(R.layout.voice3, null); 
      collection.addView(view); 
     } 

     return view; 
    } 
    @Override 
    public int getCount() { 
     return 3; 
    } 

    @Override 
    public boolean isViewFromObject(View arg0, Object arg1) { 
     return arg0 == arg1; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View)object); 
    } 
} 
+0

Вы сказали, что пейджера содержит ListView. Диалог 'listview = (ListView) dialog.findViewById (R.id.listView)' не сможет найти его напрямую. –

+0

Вы используете фрагменты в представлении пейджера? –

+0

Можем ли мы увидеть компоновку voicesialog? – Amsheer

ответ

0

Этот XML не имеют ListView. Вы устанавливаете как это dialog.setContentView(R.layout.voicedialog); и пытаетесь получить из этого диалога. Который не содержит Listview автоматически он будет получает нуль»

Edit 1: Внутри ViewPager вы добавляете Listview так что вам нужно, чтобы добавить функциональность внутри ViewPager адаптера.

Edit 2:

Вам нужно добавить эти следующий код внутри вашего ViewPager

if(position==0) { 
      view = inflater.inflate(R.layout.voice1, null); 
      collection.addView(view); 


arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, contactArrayList); 
     listview = (ListView) view .findViewById(R.id.listView); 
     listview.setAdapter(arrayAdapter); 
     arrayAdapter.notifyDataSetChanged(); 
} 
+0

Итак, как мне получить «listview»? –

+0

Проверьте мои изменения и опубликуйте код адаптера viewpager. – Amsheer

+0

Хорошо проверить мое редактирование Я разместил свой просмотрщик. Итак, как мне теперь ссылаться? –

2

Поскольку ListView внутри ViewPager, поэтому необходимо использовать текущую страницу Вид с ViewPager для доступа к ListView из Это. для этого используют SetTag/метод GetTag как:

1. В instantiateItem метод MyPageAdapter Добавьте метки для каждого макета:

.... 
    view.setTag("current_page_" + position); 
    return view; 
} 

2. Используйте findViewWithTag метод с pager.getCurrentItem(), чтобы получить текущую страницу Вид:

View currentView = (View)pager.findViewWithTag(
     "current_page_" + pager.getCurrentItem()); 

3. Теперь ListView доступа с помощью currentView:

listview = (ListView) currentView.findViewById(R.id.listView); 
+0

После этого я все равно получаю сообщение об ошибке, но он немного отличается –

+0

http://chat.stackoverflow.com/rooms/131761/viewpager –

+0

Продолжим эту дискуссию в чате –

Смежные вопросы