我遇到了一个我自己不能处理的问题,我检查了每一行代码,但它仍然不起作用。
我有代表播放列表(普通MediaStore.Audio.Playlist)的draggable listener和用于改变歌曲顺序的drop listener。
listView.setDropListener(new DragSortListView.DropListener() {
@Override
public void drop(int i, int i2) {
if(playlistId != -1) {
boolean moved = MediaStore.Audio.Playlists.Members.moveItem(getContentResolver(), playlistId, i, i2);
System.out.println("Item moved " + moved);
}
}
});我还有contentObserver,它可以处理游标的重新加载。
private class MyContentObserver extends ContentObserver {
MyContentObserver(Handler handler) {
super(handler);
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange);
System.out.println("Updated");
}
}当然句柄是注册的
getContentResolver().registerContentObserver(Uri.parse("content://media"), true, contentObserver);但这里有一个问题- moveItem总是返回true,但歌曲的顺序保持不变。在2.3.6的moveItem上完全不能工作,在4.4.2上--有时,在装有4.4.4的索尼平板电脑上--一切都运行得很好。我也尝试了这个代码,得到了相同的结果
public static final boolean moveItem(ContentResolver res,
long playlistId, int from, int to) {
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
playlistId)
.buildUpon()
.appendEncodedPath(String.valueOf(from))
.appendQueryParameter("move", "true")
.build();
ContentValues values = new ContentValues();
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, to);
return res.update(uri, values, null, null) != 0;
}发布于 2015-02-28 22:19:05
我已经在我的播放列表细节上实现了拖放。大多数(如果不是全部来自这个论坛)if看起来比你的方法更复杂。也许下面的代码片段将帮助您在listview (播放列表上的曲目)的行上设置一个longclicklistener
private final class MyItemLongClickListener implements OnItemLongClickListener {
public boolean onItemLongClick(AdapterView<?> arg0, View v,
int row, long rowid) {
if (android.os.Build.VERSION.SDK_INT > 10) {
Cursor crs = (Cursor) mAdapter.getItem(row);
int audio_id = crs.getInt(crs.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
int _id = crs.getInt(crs.getColumnIndex(MediaStore.Audio.Playlists.Members._ID));
int playorder_col = crs.getColumnIndexOrThrow(MediaStore.Audio.Playlists.Members.PLAY_ORDER);
String playorder = crs.getString(playorder_col);
String text = row + ":" + audio_id + ":" + lngplaylist_id + ":" +
playorder +
":" + _id;
ClipData.Item item = new ClipData.Item(text);
ClipData dragData = new ClipData(text, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN, ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
dragData.addItem(new ClipData.Item(String.valueOf(row)));
mListView.setOnDragListener(new MyDragListener());
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
v.startDrag(dragData, //data to be dragged
shadowBuilder, //drag shadow
v, //local data about the drag and drop operation
0 //no needed flags
);
// v.setVisibility(View.INVISIBLE);
return true;
}
return false;
}
class MyDragListener implements OnDragListener {
public int PositionOfDraggedItem = -1;
public int PositionOfItemDraggedOver = -1;
@Override
public boolean onDrag(View v, DragEvent event) {
int row = 0;
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
PositionOfDraggedItem = mListView.pointToPosition((int) (event.getX()), (int) event.getY());
return true;
case DragEvent.ACTION_DRAG_ENTERED:
row = mListView.getPositionForView(mListView);
return true;
case DragEvent.ACTION_DRAG_LOCATION:
case DragEvent.ACTION_DROP:
and so on发布于 2015-05-15 22:48:38
public void drop(int i, int i2) {
if(playlistId != -1) {
boolean moved = MediaStore.Audio.Playlists.Members.moveItem(getContentResolver(), playlistId, i, i2);
System.out.println("Item moved " + moved);
// scan playlists
String url = "file://" + Environment.getExternalStorageDirectory() + "/Playlists";
Uri uri = Uri.parse(url);
getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
}
}https://stackoverflow.com/questions/28699465
复制相似问题