2

这里我创建ListView显示歌曲列表。然后在列表项上单击我传递歌曲的位置以播放它。意思是我有functionlke playSong(Int Index)。这工作很不错。但是,当我执行搜索时,它会显示可搜索项目,并在该项目上单击它,我不会获取它的真实位置。可搜索列表视图

例如:

列出了我喜欢1项)与你2)你能在这里我3)让它成为

但现在,当我搜索“你可以在这里我”,它显示列表与“你可以在我身边”。当我点击这个项目,它需要0索引,并播放“与你同在”歌曲。

那么我的代码中缺少什么?请建议我。

这里是我的代码:

ArrayList<HashMap<String, String>> songsListData = new ArrayList<HashMap<String, String>>(); 
     Cursor cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null , null, null,MediaStore.Audio.Media.TITLE);   
      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); 

     // selecting single ListView item 
     ListView lv = getListView(); 

     // listening to single listitem click 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting listitem index 
       int songIndex = position; 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(), 
         AndroidBuildingMusicPlayerActivity.class); 

       // Sending songIndex to PlayerActivity 
       in.putExtra("songIndex", songIndex);     
       startActivity(in); 

      } 
     }); 

     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)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       
      } 
     }); 

} 
+0

C哎哟这个答案我已经张贴了一段时间回到所以:http://stackoverflow.com/a/12363961/450534。它有一个完整的解决方案,包括适配器和用于过滤(搜索)的主要活动。这是一个'GridView'。但这个概念是可以互换的。 –

+0

@SiddharthLele对不起,但我没有从这个解决方案的想法。 – zanky

回答

1

你可以做的是超越您的适配器回到“真正”的歌曲指数getItemId方法。然后,您将从onItemClick回调的id参数中检索此索引。在onItemClick方法

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

然后只需使用:

试试这个:

adapter = new SimpleAdapter(this, songsListData, R.layout.playlist_item, from, to) { 
     public long getItemId(int position) { 
      return songsListData.indexOf(getItem(position)); 
     } 
    }; 

,并确保您的songsListData被声明为final(这样就可以从访问它的适配器内) id而不是position

 public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting listitem index 
      int songIndex = id; 
      ... 
+0

Thanx It works perfactly .. U save my lot of time .. – zanky

+0

@fiddler,can you help me in this case ... http://stackoverflow.com/questions/20606766/search-item-in-edittext-from -listview-showing-wrong-result –

+0

实际上我被困在这一点,需要一些解决方案asap ......请 –