2013-06-30 65 views
0

我有一個搜索活動(ActivitySearch.java),當我使用軟鍵盤的「Go」按鈕時返回結果正確,它返回搜索建議的所有結果。我使用Content Provider和Cursor LoaderCallbacks。這是我第一次嘗試LoaderCallbacks並執行搜索活動。如何從搜索活動的列表視圖中正確實現onClickItem

現在我希望能夠通過onClickItem/onClickItemListenter單擊其中一個建議的結果,並讓它返回到搜索列表視圖以供用戶進行最終選擇,但我知道我的代碼並不正確,顯然。僅供參考,我已將項目中的所有活動都設爲可搜索。我查看了一堆樣品,但我一直無法收集正確的方法。

我正在使用一個簡單的活動(ActivityFloor.java),我打了硬件搜索鍵,只是幾個按鈕,啓動意圖。

我的搜索活動使用默認的android視圖來顯示listview結果。它也從MyListActivity繼承它的活動,但這是爲了支持一個通用菜單。

這裏是我的清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.birdsall.tda" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-feature android:name="android.hardware.camera" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:uiOptions="splitActionBarWhenNarrow" 
    android:exported="true" > 

    <meta-data android:name="com.google.android.apps.drive.APP_ID" android:value="id=12345" /> 

    <intent-filter> 
    <action android:name="com.google.android.apps.drive.DRIVE_OPEN" /> 
    <data android:mimeType="application/vnd.google-apps.drive-sdk.12345" /> 
    <data android:mimeType="image/png" /> 
    <data android:mimeType="image/jpeg" /> 
    <data android:mimeType="image/jpg" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.app.default_searchable" 
     android:value=".ActivitySearch" /> 

    <activity 
     android:name="com.birdsall.tda.ActivityMain" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <activity android:name=".ActivityFloor" > 
    </activity> 


    <provider 
     android:name="com.birdsall.tda.TDAProvider" 
     android:authorities="com.birdsall.tda.contentprovidertda" 
     android:exported="true" 
     android:readPermission="true" 
     android:writePermission="true" /> 

    <activity 
     android:name=".ActivitySearch" 
     android:label="Rule Search" 
     android:launchMode="singleTop" > 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
</application> 

</manifest> 

這是我在res searchable.xml/XML

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="@string/app_name" 
android:searchSettingsDescription="@string/search_description" 
android:searchSuggestAuthority="com.birdsall.tda.contentprovidertda" 
android:searchSuggestIntentAction="android.intent.action.VIEW" 
android:searchSuggestIntentData="content://com.birdsall.tda.TDAProvider/rules" 
android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" > 

</searchable> 

這裏是我的搜尋活動(ActivitySearch.java):

package com.birdsall.tda; 

import android.app.Activity; 
import android.app.LoaderManager; 
import android.app.SearchManager; 
import android.content.ContentUris; 
import android.content.CursorLoader; 
import android.content.Intent; 
import android.content.Loader; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

public class ActivitySearch extends MyListActivity implements 
    LoaderManager.LoaderCallbacks<Cursor> { 


private static String QUERY_EXTRA_KEY = "QUERY_EXTRA_KEY"; 

private SimpleCursorAdapter adapter; 
private final String TAG = "ActivitySearch"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.i(TAG, "onCreate"); 

    View mListView = getListView(); 

    Log.i(TAG, "onCreate ... after setOnItemClickListener"); 

    Toast.makeText(getApplicationContext(), "onCreate ... after setOnItemClickListener", Toast.LENGTH_LONG).show(); 

    // Create a new adapter and bind it to the List View 
    adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, null, 
      new String[] { TDAdb.COL_RULETITLE }, 
      new int[] { android.R.id.text1 }, 0); 
    setListAdapter(adapter); 

    // Initiate the Cursor Loader 
    getLoaderManager().initLoader(0, null, this); 

    // Get the launch Intent 
    parseIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    Log.i(TAG, "onNewIntent"); 
    Toast.makeText(getApplicationContext(), "onNewIntent", Toast.LENGTH_LONG).show(); 
    parseIntent(getIntent()); 

} 



private void parseIntent(Intent intent) { 
    // If the Activity was started to service a Search request, 
    // extract the search query. 
    Log.i(TAG, "parseIntent"); 
    Toast.makeText(getApplicationContext(), "parseIntent", Toast.LENGTH_LONG).show(); 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String searchQuery = intent.getStringExtra(SearchManager.QUERY); 

     // Perform the search, passing in the search query as an argument 
     // to the Cursor Loader 
     Bundle args = new Bundle(); 
     args.putString(QUERY_EXTRA_KEY, searchQuery); 

     // Restart the Cursor Loader to execute the new query. 
     getLoaderManager().restartLoader(0, args, this); 
    } 
} 

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    Log.i(TAG, "onCreateLoader"); 
    Toast.makeText(getApplicationContext(), "onCreateLoader", Toast.LENGTH_LONG).show(); 
    String query = "0"; 

    if (args != null) { 
     // Extract the search query from the arguments. 
     query = args.getString(QUERY_EXTRA_KEY); 
    } 

    // Construct the new query in the form of a Cursor Loader. 
    String[] projection = { TDAdb.KEY_ROWID, TDAdb.COL_RULETITLE }; 
    String where = TDAdb.COL_RULETITLE + " LIKE \"%" + query + "%\""; 
    String[] whereArgs = null; 
    String sortOrder = TDAdb.COL_RULETITLE; 

    // Create the new Cursor loader. 
    return new CursorLoader(this, TDAProvider.CONTENT_URI_RULES, 
      projection, where, whereArgs, sortOrder); 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    // Replace the result Cursor displayed by the Cursor Adapter with 
    // the new result set. 
    Log.i(TAG, "onLoadFinished"); 
    Toast.makeText(getApplicationContext(), "onLoadFinished", Toast.LENGTH_LONG).show(); 

    if (adapter == null) { 
     Log.i(TAG, "onLoadFinished ... adapter is NULL"); 
     Toast.makeText(getApplicationContext(), "onLoadFinished ... adapter is NULL", Toast.LENGTH_LONG).show(); 
     this.finish(); 
    } 
    Log.i(TAG, "onLoadFinished ... adapter is valued"); 
    Toast.makeText(getApplicationContext(), "onLoadFinished ... adapter is valued", Toast.LENGTH_LONG).show(); 

    adapter.swapCursor(cursor);  

} 

public void onLoaderReset(Loader<Cursor> loader) { 
    // Remove the existing result Cursor from the List Adapter. 
    Log.i(TAG, "onLoaderReset"); 
    Toast.makeText(getApplicationContext(), "onLoaderReset", Toast.LENGTH_LONG).show(); 
    adapter.swapCursor(null); 
} 

private void handleIntent(Intent intent) { 
    Log.i(TAG, "handleIntent"); 
    Toast.makeText(getApplicationContext(), "handleIntent", Toast.LENGTH_LONG).show(); 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     // Gets the search query from the voice recognizer intent 
     String query = intent.getStringExtra(SearchManager.QUERY); 

     // Set the search box text to the received query and submit the 
     // search 
     // mSearchView.setQuery(query, true); 
    } 
} 

    @Override 
    protected void onListItemClick(ListView listView, View view, int position, long id) { 
    super.onListItemClick(listView, view, position, id); 
    Toast.makeText(getApplicationContext(), 
    " search listview position:" + position, 
    Toast.LENGTH_LONG).show(); 
    // Create a URI to the selected item. 
    Uri selectedUri = 
     ContentUris.withAppendedId(TDAProvider.CONTENT_URI, id); 

    // Create an Intent to view the selected item. 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setData(selectedUri); 

    // Start an Activity to view the selected item. 
    startActivity(intent); 
    } 

} 

我NO更長的獲取錯誤,感謝Micheal(下),所以LOGCAT錯誤可以忽略。

我得到的錯誤,但只是試圖從我的logcat實現onClickItem編碼,我已包括爲了完整性。

06-2923:56:57.416: I/TDAProvider(13786): query 
06-2923:56:57.439: W/SuggestionsAdapter(13786): Search suggestions query threw an exception. 
06-2923:56:57.439: W/SuggestionsAdapter(13786): java.lang.IndexOutOfBoundsException 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.net.Uri$PathSegments.get(Uri.java:978) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.net.Uri$PathSegments.get(Uri.java:963) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at com.birdsall.tda.TDAProvider.query(TDAProvider.java:180) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.content.ContentProvider.query(ContentProvider.java:652) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.content.ContentProvider$Transport.query(ContentProvider.java:189) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.content.ContentResolver.query(ContentResolver.java:370) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.content.ContentResolver.query(ContentResolver.java:313) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.app.SearchManager.getSuggestions(SearchManager.java:823) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.widget.SuggestionsAdapter.runQueryOnBackgroundThread(SuggestionsAdapter.java:190) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.widget.CursorFilter.performFiltering(CursorFilter.java:49) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.os.Looper.loop(Looper.java:137) 
06-2923:56:57.439: W/SuggestionsAdapter(13786):  at android.os.HandlerThread.run(HandlerThread.java:60) 
06-2923:57:00.002: I/TDAProvider(13786): query 
06-2923:57:00.049: I/TDAProvider(13786): query return cursor 
06-2923:57:00.635: I/TDAProvider(13786): query 
06-2923:57:00.635: I/TDAProvider(13786): query return cursor 
06-2923:57:01.275: I/TDAProvider(13786): query 
06-2923:57:01.275: I/TDAProvider(13786): query return cursor 
06-2923:57:02.650: W/InputEventReceiver(13786): Attempted to finish an input event but the input event receiver has already been disposed. 
06-2923:57:02.689: I/ActivitySearch(13786): onCreate 
06-2923:57:02.728: D/AndroidRuntime(13786): Shutting down VM 
06-2923:57:02.728: W/dalvikvm(13786): threadid=1: thread exiting with uncaught exception (group=0x40e1b2a0) 
06-2923:57:02.728: E/AndroidRuntime(13786): FATAL EXCEPTION: main 
06-2923:57:02.728: E/AndroidRuntime(13786): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.birdsall.tda/com.birdsall.tda.ActivitySearch}: java.lang.ClassCastException: com.birdsall.tda.ActivitySearch cannot be cast to android.view.View$OnClickListener 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2136) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2174) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.ActivityThread.access$700(ActivityThread.java:141) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.os.Looper.loop(Looper.java:137) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.ActivityThread.main(ActivityThread.java:5059) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at java.lang.reflect.Method.invoke(Method.java:511) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at dalvik.system.NativeStart.main(Native Method) 
06-2923:57:02.728: E/AndroidRuntime(13786): Caused by: java.lang.ClassCastException: com.birdsall.tda.ActivitySearch cannot be cast to android.view.View$OnClickListener 
06-2923:57:02.728: E/AndroidRuntime(13786):  at com.birdsall.tda.ActivitySearch.onCreate(ActivitySearch.java:39) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.Activity.performCreate(Activity.java:5058) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
06-2923:57:02.728: E/AndroidRuntime(13786):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
06-2923:57:02.728: E/AndroidRuntime(13786):  ... 11 more 
06-2923:57:04.392: I/Process(13786): Sending signal. PID: 13786 SIG: 9 

感謝您的時間和幫助,提前。

這是MyActivity的要點,只是我活動的常用菜單。

package com.birdsall.tda; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MyListActivity extends ListActivity { 

String selectParam = ""; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
    case android.R.id.home: 
      Intent intent = new Intent(this, ActivityMain.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
      return true; 

    case R.id.am_index: 
     Intent i1 = new Intent(this, ActivityIndex.class); 
     startActivity(i1); 
     return true;  

     /* ... More menu items */ 

    default: 
     return super.onOptionsItemSelected(item); 
    } 

} 
} 
+0

什麼是MyListActivity? – Raghunandan

+0

我在上面提到它,它是Activity的重寫,它只是具有常用的菜單信息,我添加了源。 –

+0

我從另一個項目中找了一份工作的搜索活動,並用它取代了我的代碼,我仍然得到了相同的結果。 –

回答

0

我花了約2幾個星期在這和關閉和我的代碼已經改變了一下。我發現setContentView和我的本地佈局是沒有得到結果的問題。我會在代碼上發佈一個新版本。謝謝大家。

package com.birdsall.tda; 

import android.app.LoaderManager; 
import android.app.SearchManager; 
import android.app.SearchableInfo; 
import android.content.ContentUris; 
import android.content.Context; 
import android.content.CursorLoader; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.Loader; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 

public class ActivitySearch extends MyListActivity implements 
    LoaderManager.LoaderCallbacks<Cursor> { 

private static String QUERY_EXTRA_KEY = "QUERY_EXTRA_KEY"; 
private static final String TAG = "ActivitySearch"; 

private SimpleCursorAdapter adapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Log.i(TAG, "onCreate"); 

    adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, null, 
      new String[] { TDAdb.COL_RULETITLE }, 
      new int[] { android.R.id.text1 }, 0); 
    setListAdapter(adapter); 

    getLoaderManager().initLoader(0, null, this); 

    parseIntent(getIntent()); 


    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchableInfo searchableInfo = searchManager 
      .getSearchableInfo(getComponentName()); 

    Log.i(TAG, "onCreate at end"); 

} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    Log.i(TAG, "onNewIntent"); 
    parseIntent(getIntent()); 
} 

private void parseIntent(Intent intent) { 

    Log.i(TAG, "parseIntent"); 

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String searchQuery = intent.getStringExtra(SearchManager.QUERY); 
     // Perform the search 
     performSearch(searchQuery); 
    } 
} 

private void performSearch(String query) { 
    Log.i(TAG, "performSearch"); 
    Bundle args = new Bundle(); 
    args.putString(QUERY_EXTRA_KEY, query); 

    getLoaderManager().restartLoader(0, args, this); 
} 

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    String query = "0"; 
    Log.i(TAG, "onCreateLoader"); 
    if (args != null) 
     query = args.getString(QUERY_EXTRA_KEY); 

    String[] projection = { TDAdb.KEY_ROWID, TDAdb.COL_RULETITLE }; 
    String where = TDAdb.COL_RULETITLE + " LIKE \"%" + query + "%\""; 

    String[] whereArgs = null; 
    String sortOrder = TDAdb.COL_RULETITLE; 

    return new CursorLoader(this, TDAProvider.CONTENT_URI_RULES, 
      projection, where, whereArgs, sortOrder); 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 

    adapter.swapCursor(cursor); 
    adapter.notifyDataSetChanged(); 

    Log.i(TAG, "onLoadFinished ... cursor has " + cursor.getCount() 
      + " row(s)"); 
       + " row(s)", Toast.LENGTH_SHORT).show(); 
} 

public void onLoaderReset(Loader<Cursor> loader) { 
    Log.i(TAG, "onLoaderReset"); 
    adapter.swapCursor(null); 
} 

/** 
* Listing 8-28: Providing actions for search result selection 
*/ 
@Override 
protected void onListItemClick(ListView listView, View view, int position, 
     long id) { 
    super.onListItemClick(listView, view, position, id); 

    Log.i(TAG, "onListItemClick"); 

    Uri selectedUri = ContentUris.withAppendedId(
      TDAProvider.CONTENT_URI_RULES, id); 

    Intent i = new Intent(ActivitySearch.this, ActivityRulesCrossRef.class); 
    Bundle extras = new Bundle(); 
    extras.putString("XRef", "N"); 
    String str_rowid = String.valueOf(id); 
    extras.putString("selectedID", str_rowid); 
    extras.putString("selectedRule", "Search"); 
    i.putExtras(extras); 
    startActivity(i); 
    finish(); 

} 

public void onDismiss(final DialogInterface arg0) { 
    finish(); 
} 

} 
0

試試這個

@Override 
public void onListItemClick(ListView parent, View v, int position, long id) 
{ 
//... 
} 

Activity

你不需要設置listener

希望這有助於..

+0

Eclipse抱怨說:'方法setOnClickListener(View。OnClickListener)在類型View中不適用於參數(ActivitySearch) ',所以我將其更改爲以下內容:'mListView.setOnClickListener((OnClickListener)this);'但它仍然爆炸。我正在考慮是否有mListView錯誤定義,或者有一個搜索類需要重寫。感謝您的建議。 –

+0

我收到了你的建議,以阻止程序被轟出,但在選擇一個項目後,我仍然沒有在我的列表視圖中看到任何東西。我更新了原來的ActivitySearch。 –

相關問題