0

私はナビゲーションドロワーを持っており、ListView内のアイテム内のコンテンツを取得したいと思います。私は位置を取得することができますが、クリックした項目の内容を取得するためにリストビューにリンクする方法はありません。デバッガで私は、リストビューを存在して見て、私はxmlファイルの中に持っているleft_drawer idは同じでも示していると私は取得しよう:NPEを取得すると、ナビゲーションドロワーのクリックされた位置でListViewコンテンツを取得できません。

android.widget.ListView{634ed4d VFED.VC.. .F..H.ID 0,0-630,1731 #7f0e004f app:id/left_drawer} 

はので、私はに間違ってやっているかと思っていますNPEを持っていると、なぜ私はアイテム

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 

//I have the position of the list view, and want to retrieve the content of the selected item at that position 
ListView listView = (ListView) view.findViewById(R.id.left_drawer); 
String sk = (String) listView.getItemAtPosition(position);//NPE because listView is null? 
     Log.d("DEBUG", "onItemClick: "+sk); 

//  listView.getChildAt(0); 
//listView.getSelectedItem(); 

} 
} 

を取得していないと、これはエラーメッセージ

Process: android.com.myapp, PID: 28051 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.widget.ListView.getItemAtPosition(int)' on a null object reference 
                       at android.com.myapp.DrawerItemClickListener.onItemClick(DrawerItemClickListener.java:22) 

これはナビゲーションドロワー

です
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 

    > 
    <!-- The main content view --> 

    <fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/fragment_as_list" 
    android:name="android.com.myApp.FragmentA" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
     /> 

    <ListView android:id="@+id/left_drawer" 
     android:layout_width="240dp" 

     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="19dp" 
     android:background="@drawable/image_background" 
     android:paddingTop="?android:attr/actionBarSize" 

     android:paddingLeft="@dimen/activity_horizontal_margin" 

     android:paddingRight="@dimen/activity_horizontal_margin" 

     android:paddingBottom="@dimen/activity_vertical_margin" 
     /> 
</android.support.v4.widget.DrawerLayout> 

更新

私の意見では、これは些細なNPEの質問ではありません。削除する条件を設定しようとしても例外はありませんでした。なぜなら、ListViewはメインクラスで2回、GoogleチュートリアルがDrawerオブジェクトの匿名クラスを移動した新しいクラスで2回開始されたからです。

また、特にNavigation Drawerから項目を取得する方法については、SOに記載されているケースがあります。問題は簡単に直感的にサイズ変更可能ですがListView.getItemAtPosition()です。 1つのクラスに戻り、すべてが機能しています。

+0

の可能性のある重複(http://stackoverflow.com/質問/ 218384/what-is-a-nullpointのレセプションと方法は - 私はそれを修正する) –

+0

私はそうは思わない。問題はNPEではないが、実際にはlistviewはnullではなく、テキストを私に与えるべきである。 – trocchietto

+0

Rotwang、それを持っています。混乱は、GoogleチュートリアルがインターフェイスonItemClickListenerを拡張する別のクラスを呼び出すという事実から始まるので、リストビューのmDrawerListは匿名ではなく、他の人のFaisalは同じIDを参照するリストビューを2回インスタンス化した。可能であれば、upvoteを削除することができますか?それは、 – trocchietto

答えて

1

スニペットに論理エラーがあります。すでにリストのsetOnItemClickListenerメソッド内にあり、リストを再度初期化しても、それは何も保持されません。

yourListView.setOnItemClickListener(new OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 

    //get your content in Object (parent class of all) 
    Object objContent = yourListView.getAdapter().getItem(position); 
    String valContent = objContent .toString(); 
    Toast.makeText(YourMainActivity.this,"Content= "+valContent, Toast.LENGTH_LONG).show(); 
    } 
}); 
+0

私は、良い点を理解していますが、どのようにリストビューを呼び出すことができますか?問題はlistViewがnullであるためです。では、リストビューをインスタンス化しないと、あなたは提案する行をどのように呼び出すことができますか? trocchietto

+0

@trocchietto Androidの他のすべてのビューと同様に、リストビューはonCreateメソッドで初期化する必要があります。これは "標準的な"方法です:ビューがレイアウトファイル(.xml)で宣言されていれば、それはonCreateメソッド内のfindViewById(..)コードで(またはsetContentViewメソッドが呼び出された後)です。コードの私の答えを参照してください –

+0

ロレンツォ、私はあなたに興味を持ってupvoteすることができます – trocchietto

1

あなたはonItemClickListenerの外レイアウトファイルでのListViewを見つける必要があります。 ListView参照をインスタンスフィールドに割り当てて、clickイベントハンドラ内で使用することができます。

これは、擬似コード(今それをテストすることはできません)です。[?何NullPointerExceptionがある、と私はそれをどのように修正すればよい]

private ListView list;  

public onCreate(..) { 
    setContentView(..); 

    list = findViewById(R.id.left_drawer); 
    list.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
      //here you have a reference of your ListView, and the position of the clicked item. 
      list.getAdapter().getItem(position); //this is the clicked item 
     } 
    }); 
} 
+0

Googleチュートリアルの示唆しているように、別のクラスのonItemClickListenerを実装しているので、ListViewが範囲外だったためにLorenzoが動作しません。私はもうlistviewにアクセスできませんでした。 – trocchietto

関連する問題