2017-09-03 4 views
0

Ich bin ein Searchview in der Aktionsleiste in einer meiner Tätigkeit implementieren. In dieser Aktivität listet es alle Lieder meines Telefons auf und ich benutze benutzerdefinierte Listenansicht dafür. Alles funktioniert gut, außer dass die Searchview in der Aktionsleiste angezeigt wird, aber es funktioniert nicht, es ist so, als würde ich nichts eingeben. Ich versuche, alles über die Implementierung von Searchview zu suchen und versuchte das Problem selbst zu lösen, aber nichts funktioniert wirklich.Android Searchview in benutzerdefinierten Listenansicht funktioniert nicht

das was ich bisher gemacht habe.

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> 

das ist meine Art Adapter, 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(); 
     } 
    } 

auf meine Aktivität, 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; 
} 

Ihre Hilfe Jungs brauchen. Vielen Dank im Voraus!

+0

Sie sagen, dass Sie zur Eingabe von Text nicht in der Lage sind, oder Sie können die Texteingabe, aber Sie können‘ t senden Sie die Abfrage? – davehenry

+0

Ich kann Text eingeben, aber nichts passiert, das ist mein Problem :(es scheint wie es nicht funktioniert. Was ich will, ist zum Beispiel, wenn ich den Buchstaben "A" in der Suchansicht eingeben wird die Listview aktualisiert und es wird die ganze Musik auflisten beginnt mit dem Buchstaben "A". – asgardwin7

+0

Bitte helfen Sie mir. – asgardwin7

Antwort

1

Tauschen Sie BaseAdapter für ArrayAdapter aus und übergeben Sie Songs an den Superklassenkonstruktor. Entfernen Sie dann Ihre Variable _songs und greifen Sie stattdessen über die Methode getItem() der Super-Klasse darauf zu. Sobald Sie das getan haben, ändern Sie Ihre publishResults() -Methode, um direkt die Superklasse Daten zB zu ändern:

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