2016-12-29 1 views
-1

によって引き起こさ:ダイアログのNullpointerexception?

は私がカスタムを持ってnullオブジェクト参照で '無効android.widget.ListView.setAdapter(android.widget.ListAdapter)' 仮想メソッドを呼び出すために試み:java.lang.NullPointerExceptionが

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

ここでも、リストビューは私のダイアログでは、私のviewpagerにおけるレイアウトのいずれかであるのIDで、:私のArrayAdapterを設定しようとしたときしかし、私はNullPointerExceptionが取得しています、listview含まViewPagerを含むdialoglistView

私の質問は、上記のコードで明確に参照していますが、なぜリストビューが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> 

ありViewPagerに入る3つのXMLレイアウトがありますが、リストビューで1私はそのコードを置く理由は、最初のページであり、 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)dialog.findViewById(R.id.listView)'ダイアログで直接見つけることができません –

+0

ビューのページャでフラグメントを使用していますか? –

+0

音声合成のレイアウトは見えますか? – Amsheer

答えて

0

このXMLリストビューを持っていません。あなたはこのように設定していますdialog.setContentView(R.layout.voicedialog); このダイアログから取得しようとしています。それは編集1「

をヌル取得、自動的に何のリストビューがします含まれていません: あなたはViewPagerアダプタの内部で機能を追加する必要があるので、あなたはリストビューを追加するviewpagerの内部。

編集2:

ListViewViewPagerの内側にあるので、からリストビューにアクセスするためにViewPagerから現在のページビューを使用する必要があるので、あなたは、あなたの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

私の編集をチェックして、あなたのビューページアダプターコードを投稿してください。 – Amsheer

+0

私の編集を確認してください私のビューページを投稿しました。だから今私はそれをどのように参照するのですか? –

2

の内部でこれらの次のコードを追加する必要がありますそれ。この使用のためのsetTag /のgetTagメソッドのような:MyPageAdapterinstantiateItem方法で

1.各レイアウトのためのタグを追加する:現在のページビューを取得するpager.getCurrentItem()

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

2.使用findViewWithTag方法:

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

3。は今currentViewを使用してリストビューにアクセス:

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

これを実行した後でもエラーは発生しますが、若干異なります –

+0

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

+0

チャットでこのディスカッションを続けましょう –

関連する問題