第 X 行的 Android 搜索建议光标返回异常

标签 android nullpointerexception

我一直在尝试让这段代码正常工作,但并不愉快。这是来自 logcat 的错误

Search suggestions cursor at row 0 returned exception.
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.app.SearchableInfo.getSuggestIntentAction()' on a null object reference
            at android.support.v7.widget.SearchView.createIntentFromSuggestion(SearchView.java:1541)
            at android.support.v7.widget.SearchView.launchSuggestion(SearchView.java:1357)
            at android.support.v7.widget.SearchView.onItemClicked(SearchView.java:1270)
            at android.support.v7.widget.SearchView.access$1900(SearchView.java:104)
            at android.support.v7.widget.SearchView$10.onItemClick(SearchView.java:1294)
            at android.widget.AutoCompleteTextView.performCompletion(AutoCompleteTextView.java:905)
            at android.widget.AutoCompleteTextView.access$500(AutoCompleteTextView.java:90)
            at android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick(AutoCompleteTextView.java:1195)
            at android.widget.AdapterView.performItemClick(AdapterView.java:300)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1143)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044)
            at android.widget.AbsListView$3.run(AbsListView.java:3833)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

烦人的是它有点管用。我能够看到显示的结果,但是当我点击结果时(我没有 onclicklistener)我得到了上面的错误。

package com.overdrivedx.arep;

import android.app.SearchManager;
import android.content.Context;
import android.database.MatrixCursor;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.overdrivedx.adapter.SearchAdapter;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends ActionBarActivity {
    private List<String> items;
    private Menu menu;

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

        items = new ArrayList<String>();
        items.add("Lagos");
        items.add("Yahoo");
        items.add("Gooogle");
        items.add("OK! Stupid");
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        this.menu = menu;

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView search = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        search.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        //search.setIconifiedByDefault(true); // Do not iconify the widget; expand it by default

        search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                loadData(s);
                return false;

            }

        });
        return true;
    }

    private void loadData(String q) {
            String[] columns = new String[] { "_id", "text" };
            Object[] temp = new Object[] { 0, "default" };

            MatrixCursor cursor = new MatrixCursor(columns);

            ArrayList <String> listClone = new ArrayList<String>();

            for (String string : items) {

                if(string.matches("(?i)(" + q +").*")){
                    listClone.add(string);
                }
            }

            if(listClone.size() < 1) {
                listClone.add("No results");
            }

            for(int i = 0; i < listClone.size(); i++) {
                temp[0] = i;
                temp[1] = listClone.get(i);
                Log.v("input", listClone.get(i));
                cursor.addRow(temp);
            }

        MenuItem searchItem = menu.findItem(R.id.menu_search);
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchItem);

        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        searchView.setSuggestionsAdapter(new SearchAdapter(this, cursor, listClone));

}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

我还有一个 SearchAdapter 类。

package com.overdrivedx.adapter;

import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.overdrivedx.chatarep.R;
import java.util.List;

public class SearchAdapter extends CursorAdapter {

    private List items;
    private TextView text;

    public SearchAdapter(Context context, Cursor cursor, List items) {
        super(context, cursor, false);
        this.items = items;

    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // Show list item data from cursor
        text.setText((CharSequence) items.get(cursor.getPosition()));
        // Alternatively show data direct from database
        //text.setText(cursor.getString(cursor.getColumnIndex("column_name")));

    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.activity_search_results, parent, false);
        text = (TextView) view.findViewById(R.id.text);
        return view;
    }

}

最佳答案

这个问题也让我抓狂了2天。发生的情况是,在您点击结果后,您的应用预计操作尚未完成,并试图进一步进入 Intent 参数。

最简单的方法,也是我解决它的方法,是让 Activity 实现 SearchView.OnSuggestionListener 并在 onSuggestionClick(int p) 的覆盖方法中返回 true,它会通知您的应用点击操作已完成。

关于第 X 行的 Android 搜索建议光标返回异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765397/

相关文章:

java - 我怎样才能让我的应用程序运行并解决这个错误

android - 错误的 token 异常 - 无法添加窗口(棉花糖 - float 工具栏)

安卓工作室 : Bitmap to ImageView Error

java - 调用 Window.setVisible() 时出现 NullPointerException

java - Cplex Java API 中变量的生成

java - Android - 糖库 NullPointerException

android - 通过 Android 中的耳机插孔输入音频?

android - 动态更新ListView的 View 类型

android - 每个新 View 都需要一个新的布局参数吗?

java - Java中如何将null转为false?