Список с возможностью поиска
Здесь я создаю 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;
...