AndroidやJavaに新しくやって学習していますが、ListViewのアイテムのクリックを検出するには何かが欠けているようです。setOnItemClickListenerを呼び出すときのヌルポインターの例外
私は、それらの下にリストビューを持つボタンのカップルであるアクティビティを持っています。各ListView項目には、クリック可能なアイコンがあり、最終的には別のアクティビティに移動し、タイムスタンプ(現在はクリックがToast経由で機能していることを示しています)が表示されます。アイコン上のクリック検出は機能していますが、ListView内の項目の選択を実装しようとしています。これが問題のある部分です。
私は実行時例外を受け付けておりますように、私はそのようなthisなど多くの例を検討していると私は処方通り、私はそれをやっているが、私は明らかに何かが足りないと思う「のjava.lang.NullPointerException:仮想メソッドを呼び出すための試み「ボイドnullのオブジェクト参照のandroid.widget.ListView.setOnItemClickListener(android.widget.AdapterView $ OnItemClickListener)」:ここでは
<?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>
がためのレイアウトである:」ここに
は、ビューのレイアウトでありますリストビューの項目。タイムスタンプで左に述べたように、それはアイコン:ここ
<?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>
は彼が私のアダプタを設定し、私の活動から)(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;
}
}
Aha。わかった。迅速な返信をありがとう。 OnCreate()に移動しました。 – sje