0

Navigation Drawer가 있고 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는 메인 클래스에서 한 번 두 번 시작되었으므로 예외적입니다. Google지도에서 Drawer 객체를 익명 클래스로 옮긴 새 클래스에서 다른 시간에 다시 시작 되었기 때문입니다.

Navigation Drawer에서 항목을 구체적으로 검색하는 방법에 대해서는 SO에 언급 된 모든 경우가 있습니다. 문제는 직관적으로 간단하게 ListView.getItemAtPosition()으로 크기를 조정할 수 있습니다. 하나의 클래스를 되돌려 보면 모든 것이 작동하고 있습니다.

+0

의 사용 가능한 복제 [? NullPointerException이 무엇인가, 나는 그것을 해결 어떻게 (http://stackoverflow.com/ 질문/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

나는 그렇게 생각하지 않는다. 문제는 NPE를 넘지는 않지만 listview가 null이 아니어야하고 텍스트가 나에게 주어져서는 안된다. – trocchietto

+0

Rotwang, 알겠습니다. 혼란은 Google 자습서가 onItemClickListener 인터페이스를 확장하는 다른 클래스를 호출한다는 사실에서 시작됩니다. 익명이 아니므로 List View mDrawerList가 범위를 벗어났습니다. 다른 사람이 Faisal이 응답 한 것처럼 동일한 ID를 참조하는 List View를 두 번 인스턴스화했습니다. 가능한 경우 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

좋은 지적이지만 어떻게 목록보기를 호출 할 수 있습니까? 문제는 null 인 listView이기 때문입니다. 그렇다면 목록보기를 인스턴스화하지 않으면 제안하는 줄을 어떻게 호출 할 수 있습니까? trocchietto

+0

@trocchietto 안드로이드의 다른 모든 뷰와 마찬가지로 ListView는 onCreate 메소드에서 초기화되어야합니다. 이것은 "표준"방식입니다 : 뷰가 레이아웃 파일 (.xml)에서 선언되면 검색해야합니다 onCreate 메소드 내부에서 findViewById (..) 코드로 (또는 setContentView 메소드가 호출 된 후). 코드에 대한 내 대답을 참조하십시오 –

+0

로렌조, 내가 대답했다, 내가 관심을 upvote 수 있습니다 – trocchietto

1

당신은 onItemClickListener의 외부 레이아웃 파일 에서 ListView를 찾을 수있다. ListView 참조를 인스턴스 필드에 할당 한 다음 click 이벤트 처리기 내에서 사용할 수 있습니다.

이것은 의사입니다 (지금 그것을 테스트 할 수 없습니다) :

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

구글 튜토리얼에서 제안한대로 다른 클래스의 onItemClickListener를 구현 했으므로 ListView가 범위를 벗어 났기 때문에 Lorenzo가 작동하지 않습니다. 그래서 더 이상 listview에 액세스 할 수 없었습니다. – trocchietto

관련 문제