Текст не отображается в виджете поиска Android

Я настроил виджет поиска на панели действий, чтобы просто отфильтровать записи в моем списке, который использует настраиваемый адаптер. Однако по какой-то причине текст не отображается в виджете поиска, когда я начинаю печатать. Также, когда я сворачиваю виджет поиска, программная клавиатура все равно появляется. Я включил соответствующие классы и методы ниже.

public class MainWithTab extends ActionBarActivity {

static Context appContext;
static MainWithTab me;
CustomAdapter adapter ;

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

    appContext = getApplicationContext();
    me = this;

    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


    // For each of the sections in the app, add a tab to the action bar.
    actionBar.addTab(actionBar.newTab().setText("Songs").setTabListener(this));
    actionBar.addTab(actionBar.newTab().setText("Radio").setTabListener(this));
}


public MainWithTab getTheOne() {

    return me;
}


public Context getContext() {
    return appContext;
}



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

// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search)
        .getActionView();
searchView.setSearchableInfo(searchManager
        .getSearchableInfo(getComponentName()));
SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextChange(String newText) {
        adapter =  new ArticleFragment().getMainadapter();
adapter.getFilter().filter(newText);

        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        adapter =  new ArticleFragment().getMainadapter();
           adapter.getFilter().filter(query);
        System.out.println("adapter= " + adapter);
        return true;
    }
};
searchView.setOnQueryTextListener(queryTextListener);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){
        case R.id.action_search:System.out.println("Search!");break;
    }
  //  System.out.println("Search!");
    return true;
}}

Затем фрагмент, который имеет Listview:

public class ArticleFragment extends ListFragment {


ViewGroup v;


 static ArrayList<ListModel> CustomListViewValuesArr = new ArrayList<ListModel>();
ArticleFragment articleFragment = null;
static CustomAdapter Mainadapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if(CustomListViewValuesArr.size()==0) {
        new getSongs().execute();
    }else {
        Resources res = getResources();

        CustomAdapter adapter = new CustomAdapter(getActivity(),  CustomListViewValuesArr, res);
        setListAdapter(adapter);
    }

    articleFragment = this;
    return super.onCreateView(inflater, container, savedInstanceState);
}

public CustomAdapter getMainadapter(){

return Mainadapter;

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


}


public ArrayList<JSONObject> getSongobjs() {
    return songObjs;
}


private class getSongs extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... arg0) {
       Gets Listview items here!..code not included but works!
        return null;
    }

    protected void onPreExecute() {


    }

    protected void onPostExecute(Void unused) {


        if (getActivity() != null) {
            //* ******* Take Model Object in ArrayList **********//*
            Resources res = getResources();

            CustomAdapter adapter = new CustomAdapter(getActivity(), CustomListViewValuesArr, res);
            //setadapter
            Mainadapter =adapter;
            setListAdapter(adapter);
getListView().setTextFilterEnabled(true);
        }

    }


}


}

Пользовательский адаптер:

  /**
 * ******** Declare Used Variables ********
 */
private Activity activity;
private ArrayList<ListModel> data;
private ArrayList<ListModel> dataFilter;
private LayoutInflater inflater = null;
public Resources res;
ListModel tempValues = null;
public static ArrayList<ViewHolder> views = new ArrayList<ViewHolder>();
private ValueFilter valueFilter;
MainWithTab mainWithTab = new MainWithTab();

/**
 * **********  CustomAdapter Constructor ****************
 */
public  CustomAdapter(){

}
public CustomAdapter(Activity a, ArrayList d, Resources resLocal) {

    /********** Take passed values **********/
    activity = a;
    data = d;
    dataFilter = d;
    res = resLocal;
    //this.articleFragment = articleFragment;
    /***********  Layout inflator to call external xml layout () ***********/
    inflater = (LayoutInflater) activity.
            getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}



@Override
public Filter getFilter() {
    if(valueFilter==null) {

        valueFilter=new ValueFilter();
    }

    return valueFilter;
}
private class ValueFilter extends Filter {

    //Invoked in a worker thread to filter the data according to the constraint.
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
        if (constraint != null && constraint.length() > 0) {
            ArrayList<ListModel> filterList = new ArrayList();

            for(int i=0;i<dataFilter.size();i++){
                if((dataFilter.get(i).getSongName().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {
ListModel listModel = new ListModel();
                    listModel =dataFilter.get(i);
                    filterList.add(listModel);
                }else if((dataFilter.get(i).getSongArtiste().toUpperCase())
                        .contains(constraint.toString().toUpperCase())){
                    ListModel listModel = new ListModel();
                    listModel =dataFilter.get(i);
                    filterList.add(listModel);
                }
            }
            results.count=filterList.size();
            results.values=filterList;
        } else {
            results.count=dataFilter.size();
            results.values=dataFilter;
        }
        return results;
    }
    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {
        data=(ArrayList<ListModel>) results.values;
        notifyDataSetChanged();
    }
}


}

AndroidМанифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.seed.app">

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
      android:theme="@style/AppTheme" >
    <activity android:name=".MainWithTab" android:label="@string/app_name"
        android:hardwareAccelerated="true"
        android:screenOrientation="portrait" >

    <intent-filter>
        <action android:name="android.intent.action.SEARCH"/>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
        <meta-data android:name="android.app.searchable"
            android:resource="@xml/searchable" />

    </activity>

</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

menu/main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.seed.app.MainWithTab"

>
<!-- Search / will display always -->
<item android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/action_search"
    app:actionViewClass="android.widget.SearchView"
    app:showAsAction="ifRoom"/>
</menu>

**ОБНОВЛЕНИЕ**

Итак, я наконец заставил виджет поиска работать один раз без каких-либо изменений в моем коде. У меня есть текст, который действительно отображается в нем, но я не могу повторить его снова, и я понятия не имею, что изменилось. Просматривая logcat, я понял, что каждый раз, когда я пытаюсь ввести в виджет поиска, вызывается функция unregisterIRListener(). Любые идеи?


person ze_artista    schedule 18.06.2014    source источник
comment
сначала убедитесь, что цвет текста и цвет фона не совпадают   -  person SMR    schedule 18.06.2014
comment
как мне убедиться, что они не одинаковы? Можете ли вы опубликовать пример кода? .. кроме того, что курсор не перемещается в виджете поиска, поэтому я почти уверен, что там ничего не происходит   -  person ze_artista    schedule 23.06.2014


Ответы (2)


В MainWithTab вы можете сделать это

MenuItem item = menu.findItem(R.id.action_search);
    SearchView searchView = new SearchView(getActivity().getActionBar().getThemedContext());
    MenuItemCompat.setActionView(item, searchView);
    searchView.setOnQueryTextListener(new OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            // TODO Auto-generated method stub
            System.out.println("search query submit");
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            System.out.println("tap");
            YourAdapter ca = (YourAdapter)listview.getAdapter();

            if (TextUtils.isEmpty(newText)) {
                System.out.println("isEmpty");
                //listview.clearTextFilter();  //OPTION 1
                ca.getFilter().filter(null);   //OPTION 2
            } else {

                ca.getFilter().filter(newText);    //OPTION 2
                //listview.setFilterText(newText); //OPTION 1

            }
            return true;
        }
    });

Затем в вашем адаптере добавьте этот код

@Override
public Filter getFilter() {
    return new Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            // Now we have to inform the adapter about the new list filtered
            if (results.count == 0)
                notifyDataSetInvalidated();
            else {
                yourList = (ArrayList<Example>)results.values;
                notifyDataSetChanged(); 
            }


        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            final FilterResults oReturn = new FilterResults();

            if (constraint == null || constraint.length() == 0) {
                // No filter implemented we return all the list
                oReturn.values = yourListCopy;
                oReturn.count = yourListCopy().size;
            } else {
                final ArrayList<Example> result = new ArrayList<Example>();

                if(yourListCopy != null && yourListCopy.size() > 0) {
                    for (int i = 0; i < yourListCopy().size; i++) {
                        if(yourListCopy.get(i)
                                .getName()
                                .toUpperCase()) {
                                    result.add(yourListCopy.get(i));
                        }
                    }
                }
                oReturn.values = result;
                oReturn.count = result.size();
            }

            return oReturn;
        }
    };
}

public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}
person Jorge Casariego    schedule 16.09.2014

Добавить TextWatcher в EditText#addTextChangedListener

В onTextChanged добавьте или удалите элементы из вашего адаптера ListView.

Если вы подклассифицируете ArrayAdapter, у него будут методы добавления и удаления.

Вот рабочий пример. Пожалуйста, прочтите это.

person Aman Singh    schedule 18.06.2014
comment
Однако я не использую текст редактирования, у меня есть виджет поиска на панели действий с прослушивателем текста запроса, так что это совсем другое - person ze_artista; 23.06.2014
comment
Это было для ваших базовых знаний, как искать элемент из виджета поиска. Найдите точно отсюда developer.android.com/guide/topics/search/ search-dialog.html - person Aman Singh; 24.06.2014
comment
Я уже все это прочитал. если вы читаете мою проблему, в виджете поиска вообще нет текста - person ze_artista; 26.06.2014