获取 NPE,无法在导航抽屉中的单击位置检索 ListView 内容
Getting NPE, cannot retrieve ListView content at clicked position in Navigation Drawer
我有一个 Navigation Drawer 并且想要检索我将要单击的 ListView 中的项目内的内容。我可以检索位置,但无法 link 到列表视图以获取单击项目的内容。在调试器中,我看到它存在一个列表视图,并且还指出了与我在 xml 文件中相同的 ID left_drawer,我尝试检索:
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 在 Main Class 中启动了两次,另一次在新的 class 中 Google 教程移动了 Drawer 对象匿名 class.
此外,SO 中还提到了任何关于如何从 Navigation Drawer 中专门检索项目的案例。虽然这个问题可以直观地调整为一个简单的 ListView.getItemAtPosition()
。放回一个 class 一切正常。
您的代码段中存在逻辑错误,您已经在列表的 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();
}
});
您必须在布局文件外部 的onItemClickListener 中找到ListView。您可以将 ListView 引用分配给实例字段,然后在单击事件处理程序中使用它。
这是一个伪代码(现在无法测试):
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
}
});
}
我有一个 Navigation Drawer 并且想要检索我将要单击的 ListView 中的项目内的内容。我可以检索位置,但无法 link 到列表视图以获取单击项目的内容。在调试器中,我看到它存在一个列表视图,并且还指出了与我在 xml 文件中相同的 ID left_drawer,我尝试检索:
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 在 Main Class 中启动了两次,另一次在新的 class 中 Google 教程移动了 Drawer 对象匿名 class.
此外,SO 中还提到了任何关于如何从 Navigation Drawer 中专门检索项目的案例。虽然这个问题可以直观地调整为一个简单的 ListView.getItemAtPosition()
。放回一个 class 一切正常。
您的代码段中存在逻辑错误,您已经在列表的 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();
}
});
您必须在布局文件外部 的onItemClickListener 中找到ListView。您可以将 ListView 引用分配给实例字段,然后在单击事件处理程序中使用它。
这是一个伪代码(现在无法测试):
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
}
});
}