7

私はサードパーティのライブラリを使用して検索可能なスピナーを作成しています。私は私のアプリでライブラリクラス(SearchableListDialog、SearchableSpinner)を追加しました。すべてがうまくいっていますが、私が直面している問題の1つでもあります。検索ビューウィジェットでAbcを検索した場合、結果はAbcとしてフィルタリングされませんが、リストビューアイテムをクリックすると、 Abc。アイテムの位置が変更されているようですが、リストに検索可能な結果が表示されていません。私はどこが間違っているのか分からない。コードを何度も変更しましたが、望ましい結果を得られませんでした。検索可能なスピナーでSearchView.OnQueryTextListener()を使用するには?

enter image description here

検索可能スピナーXMLコード:

<com.example.my.currencyconverterapp.activity.SearchableSpinner 
        android:id="@+id/spinner" 
        android:layout_below="@+id/rl_currency_converterted_data" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 

これは、私が検索可能スピナーにアダプタを設定しています私の断片コードです。

countriesCustomAdapterInr = new CountriesCustomAdapterInr(getActivity(), R.layout.custom_spinner_items, arrayList,res); 
     spinner.setAdapter(countriesCustomAdapterInr); 
     assert spinner != null; 
     spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
       Toast.makeText(getActivity(), ""+arrayList.get(i).getFull_name()+i, Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) {} 
     }); 

これは、サードパーティのSearchableSpinnerクラス:

public class SearchableSpinner extends android.support.v7.widget.AppCompatSpinner implements View.OnTouchListener, 
     SearchableListDialog.SearchableItem { 

    public static final int NO_ITEM_SELECTED = -1; 
    private Context _context; 
    private List _items; 
    private SearchableListDialog _searchableListDialog; 

    private boolean _isDirty; 
    private ArrayAdapter _arrayAdapter; 
    private String _strHintText; 
    private boolean _isFromInit; 

    public SearchableSpinner(Context context) { 
     super(context); 
     this._context = context; 
     init(); 
    } 

    public SearchableSpinner(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this._context = context; 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchableSpinner); 
     final int N = a.getIndexCount(); 
     for (int i = 0; i < N; ++i) { 
      int attr = a.getIndex(i); 
      if (attr == R.styleable.SearchableSpinner_hintText) { 
       _strHintText = a.getString(attr); 
      } 
     } 
     a.recycle(); 
     init(); 
    } 

    public SearchableSpinner(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     this._context = context; 
     init(); 
    } 

    private void init() { 
     _items = new ArrayList(); 
     _searchableListDialog = SearchableListDialog.newInstance 
       (_items); 
     _searchableListDialog.setOnSearchableItemClickListener(this); 
     setOnTouchListener(this); 

     _arrayAdapter = (ArrayAdapter) getAdapter(); 
     if (!TextUtils.isEmpty(_strHintText)) { 
      ArrayAdapter arrayAdapter = new ArrayAdapter(_context, android.R.layout 
        .simple_list_item_1, new String[]{_strHintText}); 
      _isFromInit = true; 
      setAdapter(arrayAdapter); 
     } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_UP) { 

      if (null != _arrayAdapter) { 

       // Refresh content #6 
       // Change Start 
       // Description: The items were only set initially, not reloading the data in the 
       // spinner every time it is loaded with items in the adapter. 
       _items.clear(); 
       for (int i = 0; i < _arrayAdapter.getCount(); i++) { 
        _items.add(_arrayAdapter.getItem(i)); 
       } 
       // Change end. 

       _searchableListDialog.show(scanForActivity(_context).getFragmentManager(), "TAG"); 
      } 
     } 
     return true; 
    } 

    @Override 
    public void setAdapter(SpinnerAdapter adapter) { 

     if (!_isFromInit) { 
      _arrayAdapter = (ArrayAdapter) adapter; 
      if (!TextUtils.isEmpty(_strHintText) && !_isDirty) { 
       ArrayAdapter arrayAdapter = new ArrayAdapter(_context, android.R.layout 
         .simple_list_item_1, new String[]{_strHintText}); 
       super.setAdapter(arrayAdapter); 
      } else { 
       super.setAdapter(adapter); 
      } 

     } else { 
      _isFromInit = false; 
      super.setAdapter(adapter); 
     } 
    } 

    @Override 
    public void onSearchableItemClicked(Object item, int position) { 
     setSelection(_items.indexOf(item)); 

     if (!_isDirty) { 
      _isDirty = true; 
      setAdapter(_arrayAdapter); 
      setSelection(_items.indexOf(item)); 
     } 
    } 

    public void setTitle(String strTitle) { 
     _searchableListDialog.setTitle(strTitle); 
    } 

    public void setPositiveButton(String strPositiveButtonText) { 
     _searchableListDialog.setPositiveButton(strPositiveButtonText); 
    } 

    public void setPositiveButton(String strPositiveButtonText, DialogInterface.OnClickListener onClickListener) { 
     _searchableListDialog.setPositiveButton(strPositiveButtonText, onClickListener); 
    } 

    public void setOnSearchTextChangedListener(SearchableListDialog.OnSearchTextChanged onSearchTextChanged) { 
     _searchableListDialog.setOnSearchTextChangedListener(onSearchTextChanged); 
    } 

    private Activity scanForActivity(Context cont) { 
     if (cont == null) 
      return null; 
     else if (cont instanceof Activity) 
      return (Activity) cont; 
     else if (cont instanceof ContextWrapper) 
      return scanForActivity(((ContextWrapper) cont).getBaseContext()); 

     return null; 
    } 

    @Override 
    public int getSelectedItemPosition() { 
     if (!TextUtils.isEmpty(_strHintText) && !_isDirty) { 
      return NO_ITEM_SELECTED; 
     } else { 
      return super.getSelectedItemPosition(); 
     } 
    } 

    @Override 
    public Object getSelectedItem() { 
     if (!TextUtils.isEmpty(_strHintText) && !_isDirty) { 
      return null; 
     } else { 
      return super.getSelectedItem(); 
     } 
    } 
} 

これで、第三者SearchableListDialogクラス:ここOnQueryTextListener()に動作していない細かい

public class SearchableListDialog extends DialogFragment implements 
     SearchView.OnQueryTextListener, SearchView.OnCloseListener { 

    private static final String ITEMS = "items"; 

    private CountriesCustomAdapterInr listAdapter; 

    private ListView _listViewItems; 

    private SearchableItem _searchableItem; 

    private OnSearchTextChanged _onSearchTextChanged; 

    private SearchView _searchView; 

    private String _strTitle; 

    private String _strPositiveButtonText; 

    private DialogInterface.OnClickListener _onClickListener; 

    public SearchableListDialog() { 

    } 

    public static SearchableListDialog newInstance(List items) { 
     SearchableListDialog multiSelectExpandableFragment = new 
       SearchableListDialog(); 

     Bundle args = new Bundle(); 
     args.putSerializable(ITEMS, (Serializable) items); 

     multiSelectExpandableFragment.setArguments(args); 

     return multiSelectExpandableFragment; 
    } 

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

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams 
       .SOFT_INPUT_STATE_HIDDEN); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     // Getting the layout inflater to inflate the view in an alert dialog. 
     LayoutInflater inflater = LayoutInflater.from(getActivity()); 

     // Crash on orientation change #7 
     // Change Start 
     // Description: As the instance was re initializing to null on rotating the device, 
     // getting the instance from the saved instance 
     if (null != savedInstanceState) { 
      _searchableItem = (SearchableItem) savedInstanceState.getSerializable("item"); 
     } 
     // Change End 

     View rootView = inflater.inflate(R.layout.searchable_list_dialog, null); 
     setData(rootView); 

     AlertDialog.Builder alertDialog = new AlertDialog.Builder(getActivity()); 
     alertDialog.setView(rootView); 

     String strPositiveButton = _strPositiveButtonText == null ? "CLOSE" : _strPositiveButtonText; 
     alertDialog.setPositiveButton(strPositiveButton, _onClickListener); 

//  String strTitle = _strTitle == null ? "Select Country" : _strTitle; 
//  alertDialog.setTitle(strTitle); 

     final AlertDialog dialog = alertDialog.create(); 
     dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams 
       .SOFT_INPUT_STATE_HIDDEN); 
     return dialog; 
    } 

    // Crash on orientation change #7 
    // Change Start 
    // Description: Saving the instance of searchable item instance. 
    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putSerializable("item", _searchableItem); 
     super.onSaveInstanceState(outState); 
    } 
    // Change End 

    public void setTitle(String strTitle) { 
     _strTitle = strTitle; 
    } 

    public void setPositiveButton(String strPositiveButtonText) { 
     _strPositiveButtonText = strPositiveButtonText; 
    } 

    public void setPositiveButton(String strPositiveButtonText, DialogInterface.OnClickListener onClickListener) { 
     _strPositiveButtonText = strPositiveButtonText; 
     _onClickListener = onClickListener; 
    } 

    public void setOnSearchableItemClickListener(SearchableItem searchableItem) { 
     this._searchableItem = searchableItem; 
    } 

    public void setOnSearchTextChangedListener(OnSearchTextChanged onSearchTextChanged) { 
     this._onSearchTextChanged = onSearchTextChanged; 
    } 

    private void setData(View rootView) { 
     SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); 

     _searchView = (SearchView) rootView.findViewById(R.id.search); 
     _searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName 
       ())); 
     _searchView.setIconifiedByDefault(false); 
     _searchView.setOnQueryTextListener(this); 
     _searchView.setOnCloseListener(this); 
     _searchView.setQueryHint("Search Country"); 
     _searchView.clearFocus(); 
     InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
     mgr.hideSoftInputFromWindow(_searchView.getWindowToken(), 0); 


     List items = (List) getArguments().getSerializable(ITEMS); 

     _listViewItems = (ListView) rootView.findViewById(R.id.listItems); 

     //create the adapter by passing your ArrayList data 
//  listAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, items); 
listAdapter = new CountriesCustomAdapterInr(getActivity(), R.layout.custom_spinner_items, arrayList, getResources()); 
// 

     //attach the adapter to the list 
     _listViewItems.setAdapter(listAdapter); 

     _listViewItems.setTextFilterEnabled(true); 

     _listViewItems.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       _searchableItem.onSearchableItemClicked(listAdapter.getItem(position), position); 
       getDialog().dismiss(); 
      } 
     }); 
    } 

    @Override 
    public boolean onClose() { 
     return false; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String s) { 
     _searchView.clearFocus(); 
     return true; 
    } 

    @Override 
    public boolean onQueryTextChange(String s) { 
//  listAdapter.filterData(s); 
     if (TextUtils.isEmpty(s)) { 
//    _listViewItems.clearTextFilter(); 
      ((ArrayAdapter) _listViewItems.getAdapter()).getFilter().filter(null); 
     } else { 
      ((ArrayAdapter) _listViewItems.getAdapter()).getFilter().filter(s); 
     } 
     if (null != _onSearchTextChanged) { 
      _onSearchTextChanged.onSearchTextChanged(s); 
     } 
     return true; 
    } 

    public interface SearchableItem<T> extends Serializable { 
     void onSearchableItemClicked(T item, int position); 
    } 

    public interface OnSearchTextChanged { 
     void onSearchTextChanged(String strText); 
    } 
} 

。私を助けてください。私は試しましたが、解決策はありませんでした。誰でも助けてくれますか?上記、私は私のクエリを述べている。おかげ

答えて

2

あなたの例を与える代わりにSearchViewとスピナーを使用しての、I私はListViewとSearchViewでこれを達成することをお勧めします。

あなたのアクティビティにボタンを押します。このボタンをクリックすると、カスタムダイアログが開きます。

enter image description here

あなたcustom_dialog.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v7.widget.SearchView 
     android:id="@+id/searchView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <ListView 
     android:id="@+id/listView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</LinearLayout> 

その後、あなたのボタンのonClickイベントを設定し、次の操作を行います。

@Override 
      public void onClick(View view) { 
       Dialog dialog = new Dialog(SearchText.this); 
       LayoutInflater inflater = LayoutInflater.from(SearchText.this); 
       View view1 = inflater.inflate(R.layout.custom_search_layout, null); 
       ListView listView = view1.findViewById(R.id.listView); 
       SearchView searchView = view1.findViewById(R.id.searchView); 

       final ArrayAdapter<String> stringArrayAdapter = new ArrayAdapter<String>(SearchText.this, android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.my_currency)); 
       listView.setAdapter(stringArrayAdapter); 

       searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
        @Override 
        public boolean onQueryTextSubmit(String newText) { 
         return false; 
        } 

        @Override 
        public boolean onQueryTextChange(String newText) { 
         stringArrayAdapter.getFilter().filter(newText); 
         return false; 
        } 
       }); 
       dialog.setContentView(view1); 
       dialog.show(); 
      } 

enter image description here

今すぐ検索を行うには、あなたのリストビューにOnItemClickListener追加して、あなたはあなたの選択を選択した後にやりたいです。

enter image description here

+0

ます。また、リストビューの代わりにスピナーを使用することができます@Kenjin、私はそれをテストし、それが動作します。あなたの質問があれば教えてください。 –

関連する問題