Список с возможностью поиска

Здесь я создаю ListView, который показывает список песен. И при нажатии на элемент списка я передаю позицию песни, чтобы воспроизвести ее. Значит, у меня есть функция 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                          
            }
        });

}

1 ответ

Решение

Что вы можете сделать, это переопределить getItemId метод вашего адаптера, чтобы вернуть "реальный" индекс песни. Затем вы получите этот индекс из id параметр вашего onItemClick Перезвоните.

Попробуй это:

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

И убедитесь, что ваш songsListData объявляется окончательным (чтобы вы могли получить к нему доступ внутри адаптера):

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

Тогда в вашем onItemClick метод просто использовать id вместо position:

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting listitem index
            int songIndex = id;
            ...
Другие вопросы по тегам