2017-09-03 5 views
0

自分のアクティビティの1つでアクションバーにsearchviewを実装しています。そのアクティビティでは、私の電話のすべての曲がリストされており、私はそれに対してカスタムリストビューを使用しています。アクションバーでのSearchviewの表示以外はすべて正常に機能しますが、機能していないので、入力するときと同じように何も起こりません。私はsearchviewの実装についてすべてを検索しようとし、自分で問題を解決しようとしましたが、実際には何も動作しません。カスタムリストビューのAndroid Searchviewが機能していません

これまで私が行ってきたこと。

searchmenu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 
<item android:id="@+id/search" 
    android:title="@string/Search" 
    android:icon="@drawable/cast_ic_mini_controller_play" 
    app:showAsAction="always" 
    app:actionViewClass="android.support.v7.widget.SearchView" /> 

searchable.xml

<searchable 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="@string/app_name" 
android:hint="@string/search_hint"> 

のAndroidManifest.xml

<activity 
     android:name=".Music" 
     android:label="@string/title_activity_music" 
     android:parentActivityName=".backup_menu" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.chill.leoj.burp.backup_menu" /> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" 
      /> 
    </activity> 

これは私のカスタム・アダプター、Songadapter私の活動の

class SongAdapter extends BaseAdapter implements Filterable { 
    private ArrayList<SongInfo> _songs = new ArrayList<SongInfo>(); 
    private ArrayList<SongInfo> songsfilt = new ArrayList<SongInfo>(); 
    private ItemFilter itemFilter; 
    private Context context; 
    LayoutInflater inflater; 
    int checkAccumulator; 

    public SongAdapter(Context _context, ArrayList<SongInfo> songs) { 
     this.context = _context; 
     this._songs = songs; 
     this.songsfilt = songs; 
     checkAccumulator = 0; 

     getFilter(); 

    } 

    public int getCount() { 
     return _songs.size(); 
    } 

    public Object getItem(int position) { 
     return _songs.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public Filter getFilter() { 
     if (itemFilter == null) { 
      itemFilter = new ItemFilter(); 
     } 

     return itemFilter; 

    } 

    private class ViewHolder { 

     protected CheckBox checkBox; 
     private TextView tvSongName; 
     private TextView tvSongArtist; 


    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 



     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.row_songs, parent, false); 

      viewHolder = new ViewHolder(); 

      viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); 
      viewHolder.tvSongName = (TextView) convertView.findViewById(R.id.tvSongName); 
      viewHolder.tvSongArtist = (TextView) convertView.findViewById(R.id.tvArtistName); 
      viewHolder.checkBox.setOnCheckedChangeListener(null); 


      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 


     viewHolder.tvSongName.setText(_songs.get(position).getSongname()); 
     viewHolder.tvSongArtist.setText(_songs.get(position).getArtistname()); 

     viewHolder.checkBox.setOnCheckedChangeListener(null); 
     viewHolder.checkBox.setChecked(_songs.get(position).isSelected()); 

     viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
       count = (isChecked) ? count+1 : count - 1; 


       if (!_songs.get(getPosition).isSelected()) { 

        _songs.get(getPosition).setSelected(true); 
        _songs.get(getPosition).setSelected(count > 0); 
        getChoice.setEnabled(true); 
        Log.e("URL", _songs.get(position).getSongUrl() + " "); 

       } else { 
        _songs.get(getPosition).setSelected(false); 
        _songs.get(getPosition).setSelected(count < 1); 
        getChoice.setEnabled(false); 

       } 


      } 


     }); 
     convertView.setTag(R.id.tvSongName, viewHolder.tvSongName); 
     convertView.setTag(R.id.tvArtistName, viewHolder.tvSongArtist); 
     convertView.setTag(R.id.checkBox, viewHolder.checkBox); 

     viewHolder.checkBox.setTag(position); // This line is important. 

     return convertView; 
    } 

    private class ItemFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      if (constraint!=null && constraint.length()>0) { 
       ArrayList<SongInfo> tempList = new ArrayList<SongInfo>(); 

       // search content in friend list 
       for (SongInfo user : songsfilt) { 
        if (user.getSongname().toLowerCase().contains(constraint.toString().toLowerCase())) { 
         tempList.add(user); 
        } 
       } 

       filterResults.count = tempList.size(); 
       filterResults.values = tempList; 
      } else { 
       filterResults.count = songsfilt.size(); 
       filterResults.values = songsfilt; 
      } 

      return filterResults; 
     } 

     /** 
     * Notify about filtered list to ui 
     * @param constraint text 
     * @param results filtered result 
     */ 
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      _songs = (ArrayList<SongInfo>) results.values; 
      notifyDataSetChanged(); 
     } 
    } 

で、Music.java

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.search_menu, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchMenuItem = menu.findItem(R.id.search); 
    searchView = (SearchView) searchMenuItem.getActionView(); 

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setSubmitButtonEnabled(true); 
    searchView.setOnQueryTextListener(this); 

    return true; 
} 


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

@Override 
public boolean onQueryTextChange(String newText) { 
    songAdapter.getFilter().filter(newText); 
    // use to enable search view popup text 
    if (TextUtils.isEmpty(newText)) { 
     listView.clearTextFilter(); 
    } 
    else { 
     listView.setFilterText(newText.toString()); 
    } 
    return true; 
} 

は、あなたの助けの人たちを必要としています。前もって感謝します!

+0

はあなたが入力したテキストにできないことを言っているか、入力テキストことができますが、次のことができます。あなたはそれをやった後は、直接のスーパークラスのデータなどを変更するために、あなたのpublishResults()メソッドを変更クエリを提出しますか? – davehenry

+0

私はテキストを入力することはできますが、私の問題は何も起こりません:(それは機能していないように思えます。たとえば、searchviewに文字 "A"を入力すると、リストビューが更新され、文字 "A"で始まります。 – asgardwin7

+0

私を助けてください。 – asgardwin7

答えて

1

ArrayAdapterのBaseAdapterをスワップアウトし、スーパークラスのコンストラクタに曲を渡します。 _songs変数を削除し、代わりにスーパークラスのgetItem()メソッドを使用してアクセスします。 「

protected void publishResults(CharSequence constraint, FilterResults results) { 
    clear(); 
    addAll((List<SongInfo>)results.values); 
    notifyDataSetInvalidated(); 
} 
関連する問題