2017-09-03 1 views
0

Je suis en train de mettre en place un searchview dans la barre d'action de l'une de mes activités. Dans cette activité, il liste toutes les chansons de mon téléphone et j'utilise la liste personnalisée pour cela. tout fonctionne bien, sauf pour le Searchview son affichage dans la barre d'action, mais il ne fonctionne pas, c'est comme quand j'essaye de taper dedans rien ne se passe. J'essaie de tout chercher sur la mise en œuvre de searchview et j'ai essayé de résoudre le problème par moi-même mais rien ne fonctionne vraiment.Android La vue de recherche dans la liste personnalisée ne fonctionne pas

ce que j'ai fait jusqu'à présent.

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> 

ceci est mon adaptateur personnalisé, 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(); 
     } 
    } 

sur mon activité, 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; 
} 

besoin de votre aide les gars. Merci d'avance!

+0

Voulez-vous dire que vous n'êtes pas en mesure de saisir du texte, ou vous pouvez saisir du texte, mais vous pouvez » t soumettre la requête? – davehenry

+0

Je peux entrer du texte mais rien ne se passe c'est mon problème :(il semble que son fonctionnement ne fonctionne pas, ce que je veux, par exemple, quand je saisis la lettre "A" dans searchview, la listview sera mise à jour. commence par la lettre "A" – asgardwin7

+0

S'il vous plaît aidez-moi. – asgardwin7

Répondre

1

Échangez BaseAdapter pour ArrayAdapter et passez des morceaux dans le constructeur super classe. Ensuite, supprimez votre variable _songs et accédez-y via la méthode getItem() de super classe. Une fois que vous avez fait cela, changer votre méthode publishResults() pour modifier directement les super données de classe, par exemple:

protected void publishResults(CharSequence constraint, FilterResults results) { 
    clear(); 
    addAll((List<SongInfo>)results.values); 
    notifyDataSetInvalidated(); 
}