package miecak.chairs;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.AdapterView.OnItemClickListener;
public class MusicList extends Activity{
private ListView musicList;
private String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
private Cursor cursor;
private List<String> songs = new ArrayList<String>();
private String [] projection = {
MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.DURATION
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.musiclist);
//initialize the cursor
//The query results are sorted, so no need
//to do that again
cursor = this.managedQuery(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
MediaStore.Audio.Media.ARTIST);
//iterate through all the sonds and add them
//to our song list
while(cursor.moveToNext()){
songs.add(cursor.getString(1) + "-" + cursor.getString(2));
}
//create a custom arrayAdapter for our music list
MyIndexerAdapter<String> adapter = new MyIndexerAdapter<String>(this,
android.R.layout.simple_list_item_1, songs);
//get the music list and set the adapter
musicList = (ListView)findViewById(R.id.musicListView);
//enable fastScroll
musicList.setFastScrollEnabled(true);
musicList.setAdapter(adapter);
//add an onItemClickListener to our list to handle the selection
//of a song
musicList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
cursor.moveToPosition(position);
Uri songPath = Uri.parse(cursor.getString(3));
Intent intent = new Intent(null,songPath);
setResult(Activity.RESULT_OK, intent);
finish();
}
});
}
class MyIndexerAdapter<T> extends ArrayAdapter<T> implements SectionIndexer {
//ArrayList<String> myElements;
HashMap<String, Integer> alphaIndexer;
String[] sections;
public MyIndexerAdapter(Context context, int textViewResourceId,
List<T> objects) {
super(context, textViewResourceId, objects);
//myElements = (ArrayList<String>) objects;
// here is the tricky stuff
alphaIndexer = new HashMap<String, Integer>();
// in this hashmap we will store here the positions for
// the sections
int size = songs.size();
for (int i = size - 1; i >= 0; i--) {
String element = songs.get(i);
alphaIndexer.put(element.substring(0, 1).toUpperCase(), i);
//We store the first letter of the word, and its index.
//The Hashmap will replace the value for identical keys are putted in
}
// now we have an hashmap containing for each first-letter
// sections(key), the index(value) in where this sections begins
// we have now to build the sections(letters to be displayed)
// array .it must contains the keys, and must (I do so...) be
// ordered alphabetically
Set<String> keys = alphaIndexer.keySet(); // set of letters ...sets
// cannot be sorted...
Iterator<String> it = keys.iterator();
ArrayList<String> keyList = new ArrayList<String>(); // list can be
// sorted
while (it.hasNext()) {
String key = it.next();
keyList.add(key);
}
Collections.sort(keyList);
sections = new String[keyList.size()]; // simple conversion to an
// array of object
keyList.toArray(sections);
}
@Override
public int getPositionForSection(int section) {
String letter = sections[section];
return alphaIndexer.get(letter);
}
@Override
public int getSectionForPosition(int position) {
Log.v("getSectionForPosition", "called");
return 0;
}
@Override
public Object[] getSections() {
return sections; // to string will be called each object, to display
// the letter
}
}
}
|