我有这个代码来显示我的图书数据库中的详细信息,当我点击列表中的另一个活动工作正常时... 我用这段代码来做.. 但它不起作用! 谁能告诉我我的代码有什么问题? 我希望当我点击项目时,它会转到详细信息活动并显示所选书籍的其余详细信息。 请帮忙 :( ! 谢谢!
package com.example.test;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;
public class BookDetails extends Activity {
protected TextView name;
protected TextView author;
protected TextView isbn;
protected TextView copy;
protected TextView info;
protected int bookId;
private DbHelper mHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.book_details);
bookId = getIntent().getIntExtra("bID", 0);
SQLiteDatabase db = mHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM "+ DbHelper.TABLE_NAME, null);
if (cursor.getCount() == 1)
{
cursor.moveToFirst();
name = (TextView) findViewById(R.id.name);
name.setText(cursor.getString(cursor.getColumnIndex("KEY_NAME")));
author = (TextView) findViewById(R.id.author);
author.setText(cursor.getString(cursor.getColumnIndex("KEY_AUTHOR")));
isbn = (TextView) findViewById(R.id.isbn);
isbn.setText(cursor.getString(cursor.getColumnIndex("KEY_ISBN")));
copy = (TextView) findViewById(R.id.copy);
copy.setText(cursor.getString(cursor.getColumnIndex("KEY_COPIES")));
info = (TextView) findViewById(R.id.info);
info.setText(cursor.getString(cursor.getColumnIndex("KEY_INFO")));
}
}
}
这里是DisplayActivity.java
package com.example.test;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class DisplayActivity extends Activity {
private DbHelper mHelper;
private SQLiteDatabase dataBase;
private ListAdapter adapter;
private ArrayList<String> bookId = new ArrayList<String>();
private ArrayList<String> book_Name = new ArrayList<String>();
private ArrayList<String> book_Author = new ArrayList<String>();
private ArrayList<String> book_Info = new ArrayList<String>();
private ArrayList<String> book_Isbn = new ArrayList<String>();
private ArrayList<String> book_Copy = new ArrayList<String>();
public static String bNAME="bname";
public static String bAUTHOR="bauthor";
public static String bISBN="bisbn";
public static String bCOPY="bcopy";
public static String bINFO="binfo";
public static String bID="ID";
private ListView userList;
private AlertDialog.Builder build;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display_activity);
userList = (ListView) findViewById(R.id.List);
mHelper = new DbHelper(this);
userList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Intent intent = new Intent(view.getContext(),BookDetails.class);
Cursor cursor = (Cursor) adapter.getItem(position);
intent.putExtra("bID", cursor.getInt(cursor.getColumnIndex("KEY_ID")));
startActivity(intent);
}
});}
@Override
protected void onResume() {
displayData();
super.onResume();
}
/**
* displays data from SQLite
*/
private void displayData() {
dataBase = mHelper.getWritableDatabase();
Cursor mCursor = dataBase.rawQuery("SELECT * FROM "
+ DbHelper.TABLE_NAME, null);
bookId.clear();
book_Name.clear();
book_Author.clear();
book_Isbn.clear();
book_Copy.clear();
book_Info.clear();
if (mCursor.moveToFirst()) {
do {
bookId.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
book_Name.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_NAME)));
book_Author.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_AUTHOR)));
book_Isbn.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ISBN)));
book_Copy.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_COPIES)));
book_Info.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_INFO)));
} while (mCursor.moveToNext());
}
DisplayAdapter disadpt = new DisplayAdapter(DisplayActivity.this,bookId, book_Name);
userList.setAdapter(disadpt);
mCursor.close();
}
}
这是我运行时获得的LogCat ,,,
11-25 03:02:52.878: D/dalvikvm(2734): GC_FOR_ALLOC freed 59K, 4% free 3150K/3272K, paused 40ms, total 44ms
11-25 03:02:52.978: I/Choreographer(2734): Skipped 46 frames! The application may be doing too much work on its main thread.
11-25 03:02:53.038: D/gralloc_goldfish(2734): Emulator without GPU emulation detected.
11-25 03:02:55.768: D/AndroidRuntime(2734): Shutting down VM
11-25 03:02:55.768: W/dalvikvm(2734): threadid=1: thread exiting with uncaught exception (group=0xb4a4bb90)
11-25 03:02:55.818: E/AndroidRuntime(2734): FATAL EXCEPTION: main
11-25 03:02:55.818: E/AndroidRuntime(2734): Process: com.example.test, PID: 2734
11-25 03:02:55.818: E/AndroidRuntime(2734): java.lang.NullPointerException
11-25 03:02:55.818: E/AndroidRuntime(2734): at com.example.test.DisplayActivity$1.onItemClick(DisplayActivity.java:58)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.widget.AdapterView.performItemClick(AdapterView.java:299)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.widget.AbsListView$3.run(AbsListView.java:3638)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.os.Handler.handleCallback(Handler.java:733)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.os.Handler.dispatchMessage(Handler.java:95)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.os.Looper.loop(Looper.java:137)
11-25 03:02:55.818: E/AndroidRuntime(2734): at android.app.ActivityThread.main(ActivityThread.java:4998)
11-25 03:02:55.818: E/AndroidRuntime(2734): at java.lang.reflect.Method.invokeNative(Native Method)
11-25 03:02:55.818: E/AndroidRuntime(2734): at java.lang.reflect.Method.invoke(Method.java:515)
11-25 03:02:55.818: E/AndroidRuntime(2734): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
11-25 03:02:55.818: E/AndroidRuntime(2734): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
11-25 03:02:55.818: E/AndroidRuntime(2734): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
你应该在displayData()
函数中onCreate
,即
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display_activity);
userList = (ListView) findViewById(R.id.List);
mHelper = new DbHelper(this);
displayData();
userList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Intent intent = new Intent(DisplayActivity.this,BookDetails.class);
Cursor cursor = (Cursor) parent.getItem(position);
intent.putExtra("bID", cursor.getInt(cursor.getColumnIndex("KEY_ID")));
startActivity(intent);
}
});
}
答案 1 :(得分:0)
这里指出了问题:
11-25 03:02:55.818: E/AndroidRuntime(2734): java.lang.NullPointerException
11-25 03:02:55.818: E/AndroidRuntime(2734): at com.example.test.DisplayActivity$1.onItemClick(DisplayActivity.java:58)
从您的代码可以清楚地看出private ListAdapter adapter;
未在任何地方使用/初始化,而是初始化适配器DisplayAdapter disadpt = new DisplayAdapter(DisplayActivity.this,bookId, book_Name);
,以便您可以更改适配器减速度以使用正确的减速度。
DisplayActivity代码:
public class DisplayActivity extends Activity {
private DbHelper mHelper;
private SQLiteDatabase dataBase;
private DisplayAdapter disadpt; // <--- one change here
private ArrayList<String> bookId = new ArrayList<String>();
private ArrayList<String> book_Name = new ArrayList<String>();
private ArrayList<String> book_Author = new ArrayList<String>();
private ArrayList<String> book_Info = new ArrayList<String>();
private ArrayList<String> book_Isbn = new ArrayList<String>();
private ArrayList<String> book_Copy = new ArrayList<String>();
public static String bNAME = "bname";
public static String bAUTHOR = "bauthor";
public static String bISBN = "bisbn";
public static String bCOPY = "bcopy";
public static String bINFO = "binfo";
public static String bID = "ID";
private ListView userList;
private AlertDialog.Builder build;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display_activity);
userList = (ListView) findViewById(R.id.List);
mHelper = new DbHelper(this);
userList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(disadpt == null) return; // avoid crashes if not initialized
Intent intent = new Intent(DisplayActivity.this, BookDetails.class); // <-- better use activity context
Cursor cursor = (Cursor) disadpt.getItem(position);
intent.putExtra("bID", cursor.getInt(cursor.getColumnIndex(DbHelper.KEY_ID))); // <--- also this seems faulty you do not have any column named "KEY_ID"
startActivity(intent);
}
});
}
@Override
protected void onResume() {
displayData();
super.onResume();
}
/**
* displays data from SQLite
*/
private void displayData() {
dataBase = mHelper.getWritableDatabase();
Cursor mCursor = dataBase.rawQuery("SELECT * FROM "
+ DbHelper.TABLE_NAME, null);
bookId.clear();
book_Name.clear();
book_Author.clear();
book_Isbn.clear();
book_Copy.clear();
book_Info.clear();
if (mCursor.moveToFirst()) {
do {
bookId.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ID)));
book_Name.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_NAME)));
book_Author.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_AUTHOR)));
book_Isbn.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_ISBN)));
book_Copy.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_COPIES)));
book_Info.add(mCursor.getString(mCursor.getColumnIndex(DbHelper.KEY_INFO)));
} while (mCursor.moveToNext());
}
// Another change here v
disadpt = new DisplayAdapter(DisplayActivity.this, bookId, book_Name);
userList.setAdapter(disadpt);
mCursor.close();
}
}