2013-01-03 113 views
1

因此,在此代碼中,我試圖根據通過我的showResults()傳遞的查詢來檢索遊標,然後創建adapterloadermanager。我覺得問題是由於我的SimpleCursorAdapter構造函數中的佈局和id導致的,因爲在創建佈局和標識時錯誤開始了。我使用Log和if語句來查看它是否爲null,並且沒有任何內容顯示在logcat上,因此必須使用光標來表示。NullPointerException當我運行此代碼

public class SearchResultsActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

private ListView list; 
private DatabaseTable db; 
private SimpleCursorAdapter mAdapter; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_search_results); 
    db = new DatabaseTable(this); 
    handleIntent(getIntent()); 
} 

public void onNewIntent(Intent intent) { 
    setIntent(intent); 
    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     showResults(query); 
    } 

} 

private void showResults(String query) { 
    db = new DatabaseTable(this); 
    Cursor cursor = db.getContactMatches(query, null); 
    list = (ListView)findViewById(android.R.id.list); 
    mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, 
      null, new String[] {DatabaseTable.COL_NAME}, new int[] {android.R.id.text1}, 0); 
    getLoaderManager().initLoader(0, null, this); 
    list.setAdapter(mAdapter); 
    list.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent contactIntent = new Intent(getApplicationContext(), ContactActivity.class); 
      contactIntent.setData(getIntent().getData()); 
      startActivity(contactIntent); 
     } 
    }); 
} 
+0

哪一行,你在得到錯誤? – mango

+1

也發佈您的logcat輸出。 – Kanth

+0

再次,我不完全確定是否是導致問題的id和佈局,即使我這樣做,我也不知道如何將佈局設置爲simple_list_item_1,類似於您對id中的id所做的操作xml文件 –

回答

1

由於您的代碼就行了list.setAdapter(mAdapter);崩潰,list的是,這是有道理的,給你一個空指針的唯一對象。

經過進一步的檢查,很明顯,您在最初申報後並未指定list。您需要添加這樣的事情在onCreate()setContentView()後:(這是你如何訪問它,如果你的對象有android:id="@android:id/list";如果你指定你自己的ID,使用R.id.your_id_here代替)

list = (ListView) findViewById(android.R.id.list); 

+0

如果我在showResults()中做了它會有所作爲嗎? –

+0

@SaiValluri不,除了一般情況下,應儘快分配成員變量,以便所有方法都可以使用它們。通過將它放在'onCreate()'中,當'handleIntent()'之前有其他需要'list'的時候,你不必再移動它。 – Eric

+0

@SaiValluri我明白你爲什麼這麼問了,現在。這裏似乎有點不對勁 - 你使用'android.R.id.list'沒有'ListFragment'。你可以發佈你的'activity_search_results.xml'文件嗎? – Eric

0

這可能是你錯誤的位置:

mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, 
      null, new String[] {DatabaseTable.COL_NAME}, new int[] {android.R.id.text1}, 0); 

該適配器需要在現場wher傳遞到構造一個Cursor è您傳遞null的參數,如:

mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, 
      cursor, new String[] {DatabaseTable.COL_NAME}, new int[] {android.R.id.text1}, 0); 
+0

似乎並不能解決這個錯誤,但我知道把光標放在參數中是必要的。 –

+0

一旦我解決了空例外,我將檢查這個,因爲這肯定會在將來成爲一個問題。 –

+0

謝謝。但看起來埃裏克得到了正確的解決方案,不是嗎? – mango

0

試着先取數據庫讀取您的查詢之前:

db = new DatabaseTable(this); 
Cursor cursor = db.getReadableDatabase().getContactMatches(query, null); 
+0

我認爲只有DBHelper實際上可以獲得可讀的數據庫。 –

+0

但我在我的數據庫類中有一個open()方法,我應該這樣做然後關閉它? –

+0

你有類似的東西: public SqliteDatabase openDB(){ return this.getReadableDatabase(); } – ashokgelal