gpt4 book ai didi

java - 调用 setOnItemClickListener 时出现空指针异常

转载 作者:行者123 更新时间:2023-12-01 09:35:10 25 4
gpt4 key购买 nike

Android 和 Java 新手,边做边学,但我似乎缺少一些关于检测 ListView 中项目点击的基本知识。

我有一个 Activity ,它是几个按钮,下面有一个 ListView。每个 ListView 项目都有一个可以单击的图标(最终将转到另一个 Activity )和一个时间戳(当前仅指示通过 Toast 进行的单击)。图标上的点击检测正在工作,但我正在尝试在 ListView 中实现项目选择,这就是我遇到麻烦的地方。

我查看了许多示例,例如 this我认为我正在按规定执行,但我显然错过了一些东西,因为我收到运行时异常“java.lang.NullPointerException:尝试调用虚拟方法 'void android.widget.ListView.setOnItemClickListener(android.空对象引用上的 widget.AdapterView$OnItemClickListener)':"

这是 View 的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.foo.magma.ViewPassagesActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:onClick="update"
android:id="@+id/updateButton"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_weight="1"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:onClick="delete"
android:id="@+id/deleteButton"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_weight="1"/>
</LinearLayout>

<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/passagesListView"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_below="@+id/linearLayout" />
</RelativeLayout>

这是 ListView 中项目的布局。如前所述,它是左侧带有时间戳的图标:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<ImageView
android:id="@+id/icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="10dp"
android:layout_marginTop="4dp"
android:src="@drawable/curve" >
</ImageView>

<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Timestamp: "
android:textStyle="bold"
android:textSize="20dp"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/icon"
android:layout_toEndOf="@+id/icon">
android:layout_toRightOf="@+id/icon"
</TextView>

<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="layouttesttime"
android:textSize="20dp"
android:layout_below="@+id/date"
android:layout_alignRight="@+id/date"
android:layout_alignEnd="@+id/date"
android:layout_alignLeft="@+id/date"
android:layout_alignStart="@+id/date">
</TextView>

<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="layouttestdate"
android:textSize="20dp"
android:layout_alignTop="@+id/icon"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_toRightOf="@+id/label"
android:layout_toEndOf="@+id/label">
</TextView>
</RelativeLayout>

这是我 Activity 中的 onCreate(),它设置了我的适配器:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_passages);

ListView passagesListView = (ListView) findViewById(R.id.passagesListView);
assert passagesListView != null;

buildPassageList();

PassagesViewAdapter adapter = new PassagesViewAdapter(this, R.layout.passages_row_layout, passages);
passagesListView.setAdapter(adapter);


}

这就是我遇到问题的地方。图标的 OnClickListener 有效。我的目的是检测 ListView 项目的选择,以便将其删除。但是,当我添加 setOnItemClickListener() 的调用时,我收到运行时异常。

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;


public class PassagesViewAdapter extends ArrayAdapter<Passage>{

private int resource;
private List<Passage> passages;

public PassagesViewAdapter(Context context, int resource, List<Passage> passages) {
super(context, resource, passages);
this.resource = resource;
this.passages = passages;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

View view = convertView;

if (view == null) {
LayoutInflater li = LayoutInflater.from(getContext());
view = li.inflate(resource, null);
}

Passage passage = this.passages.get(position);

TextView time = (TextView) view.findViewById(R.id.time);
TextView date = (TextView) view.findViewById(R.id.date);
ImageView icon = (ImageView) view.findViewById(R.id.icon);
icon.setTag(new Integer(position));
final String positionStr = icon.getTag().toString();

// This works great!
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "You clicked on " + positionStr, Toast.LENGTH_SHORT).show();
}
});

ListView passagesListView = (ListView) view.findViewById(R.id.passagesListView);
assert passagesListView != null;

// ** This call results in a runtime error for null pointer reference.
passagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) {
Toast.makeText(getContext(), "Foo", Toast.LENGTH_SHORT).show();
}
});

time.setText(passage.getPassageTime());
date.setText(passage.getPassageDate());

return view;
}

}

最佳答案

因为适配器中的View 代表您在列表中看到的View,而不是ViewPassagesActivity 的布局。您的 ListView 项中没有 ListView,因此无法找到它,并且 findViewById 返回 null。如果将设置 OnItemClickListener 的部分移动到 ViewPassagesActivityonCreate 中,一切都应该正常工作

从适配器中删除此部件

// ** This call results in a runtime error for null pointer reference.
passagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) {
Toast.makeText(getContext(), "Foo", Toast.LENGTH_SHORT).show();
}
});

并将其添加到您的 Activity 的 onCreate 中,如下所示

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_passages);

ListView passagesListView = (ListView) findViewById(R.id.passagesListView);
assert passagesListView != null;

buildPassageList();

PassagesViewAdapter adapter = new PassagesViewAdapter(this, R.layout.passages_row_layout, passages);
passagesListView.setAdapter(adapter);

// ** This call results in a runtime error for null pointer reference.
passagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,long arg3) {
Toast.makeText(getContext(), "Foo", Toast.LENGTH_SHORT).show();
}
});
}

关于java - 调用 setOnItemClickListener 时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39040818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com