Frage

I want to add Search functionality to my listView . I want to search by Song Title. But i am not getting the way to include this functionality.

Here is my code :

ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>();
        Cursor cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null , null, null, null);          
          if (cursor == null) 
          {
              //Query Failed , Handle error.
          }
          else if (!cursor.moveToFirst()) 
          {
             //No media on the device.
          }
          else
          {

              int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
              int idColumn = cursor.getColumnIndexOrThrow(android.provider.MediaStore.Audio.Media.DATA);
              int artistcolumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST);
              int durationcolumn =cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.DURATION);

              for(int i=0;i<cursor.getCount();i++)
              {
                    String thisTitle = cursor.getString(titleColumn);
                    String path = cursor.getString(idColumn);
                    String artist = cursor.getString(artistcolumn);
                    Long duration = cursor.getLong(durationcolumn);
                    Utilities objUtilities = new Utilities();
                    String timeDuration = objUtilities.milliSecondsToTimer(duration);

                   HashMap<String, String> song = new HashMap<String, String>();
                   song.put("songTitle",thisTitle);
                   song.put("songPath", path);
                   song.put("artist", artist);
                   song.put("duration",timeDuration);

                   // Adding each song to SongList
                   songsList.add(song);
                   cursor.moveToNext();
              }
          }


        // looping through playlist
        for (int i = 0; i < songsList.size(); i++) {
            // creating new HashMap
            HashMap<String, String> song = songsList.get(i);

            // adding HashList to ArrayList
            songsListData.add(song);
        }

        // Adding menuItems to ListView
        String[] from = {"songTitle", "artist" , "duration"};
            int[] to={R.id.songTitle,R.id.songArtist, R.id.duration};
         adapter = new SimpleAdapter(this, songsListData,
                R.layout.playlist_item, from, to);

        setListAdapter(adapter);

I am not getting the solution of how to filter my listview.

i have then added below code also :

inputSearch = (EditText) findViewById(R.id.inputSearch);
        inputSearch.addTextChangedListener(new TextWatcher() {


            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                ((SimpleAdapter) PlayListActivity.this.adapter).getFilter().filter(cs); 
            }


            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }


            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });

but i am not able to find the filterng code for my this listview. can any one please help me to find the solution?? Thanx in advance.

War es hilfreich?

Lösung

I tested this sample code and it seems to work. Maybe it will help you solve your issue:

public class TestActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    EditText inputSearch = new EditText(this);
    inputSearch.addTextChangedListener(new TextWatcher() {


        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
            // When user changed the Text
            ((SimpleAdapter)getListAdapter()).getFilter().filter(cs); 
        }


        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub

        }


        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub                          
        }
    });     
    getListView().addHeaderView(inputSearch);

    ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>();

    {
        HashMap<String, String> song = new HashMap<String, String>();
        song.put("songTitle", "We are made of stars");
        song.put("artist", "Moby");
        songsListData.add(song);
    }
    {
        HashMap<String, String> song = new HashMap<String, String>();
        song.put("songTitle", "Californication");
        song.put("artist", "Red hot chili peppers");
        songsListData.add(song);
    }

    // Adding menuItems to ListView
    String[] from = { "songTitle", "artist" };
    int[] to = { R.id.songTitle, R.id.songArtist };
    SimpleAdapter adapter = new SimpleAdapter(this, songsListData, R.layout.playlist_item, from, to);

    setListAdapter(adapter);
}
}

With the following playlist_item.xml:

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

    <TextView
        android:id="@+id/songTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/songArtist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10sp" />

    <TextView
        android:id="@+id/duration"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10sp" />

</LinearLayout>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top