package cn.qylk.fragment; import java.io.File; import java.util.ArrayList; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.CheckBox; import android.widget.ListView; import cn.qylk.R; import cn.qylk.adapter.MusicListAdapter; import cn.qylk.app.APP; import cn.qylk.app.ListTypeInfo; import cn.qylk.database.MediaDatabase; import cn.qylk.dialog.PersonalListChoosingDialog; import cn.qylk.utils.SendAction; import cn.qylk.utils.SendAction.ServiceControl; /** * 歌曲列表基类 * * @author qylk 2012-04-01 */ public class Fragment_PlayList extends Fragment_ListFragmentBase implements OnItemClickListener, OnItemLongClickListener{ private class AnActionModeOfEpicProportions implements ActionMode.Callback { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { DispatchMenuClick(item.getItemId()); mode.finish(); return true; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { menu.add(Menu.NONE, 0, 1, "分享").setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(Menu.NONE, 1, 2, "添加到").setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(Menu.NONE, 2, 3, "移除").setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS); return true; } @Override public void onDestroyActionMode(ActionMode mode) { madapter.OnActionMode(false, 0); } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return true; } } private MusicListAdapter madapter; public Fragment_PlayList(ListTypeInfo listInfo) { super(listInfo); } private void AddToPersonalList(Integer[] ids) { new PersonalListChoosingDialog(getActivity()).Build(ids).show(); } /** * 处理actionmode的菜单被按事件 * * @param id */ private void DispatchMenuClick(int id) { Integer[] ids = madapter.GetSelectedList();// 已选列表 if (ids.length == 0)// 空列表 return; switch (id) { case 0:// 发送 Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); intent.setType("audio/mpeg"); File[] files = MediaDatabase.GetPaths(ids);// 获取物理路径 ArrayList<Uri> bfiles = new ArrayList<Uri>(files.length); for (File f : files) bfiles.add(Uri.fromFile(f)); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, bfiles); startActivity(intent);// 开始发送 break; case 1:// 添加到列表 AddToPersonalList(ids); break; case 2:// 删除 remove(ids); break; default: break; } } private void DispatchMusicItemClick(int position) { ListInfo.pos = position; APP.list.setListType(ListInfo); SendAction.SendControlMsg(ServiceControl.PLAYNEW); } @Override protected Cursor getCursor() { return MediaDatabase.GetCursor(ListInfo); } @Override protected View InitView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.listview, null); listview = (ListView) view.findViewById(R.id.mlt); madapter = new MusicListAdapter(inflater, getCursor());// 适配器 adapter = madapter; listview.setAdapter(adapter);// 绑定 listview.setOnItemClickListener(this); listview.setOnItemLongClickListener(this); listview.setSelectionFromTop(APP.list.getIndex(), 150); return view; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (!madapter.getState()) DispatchMusicItemClick(position); else { madapter.ToggleSelection(position); } } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if (madapter.getState()) return true; getActivity().startActionMode(new AnActionModeOfEpicProportions());// 开启actionmode菜单 madapter.OnActionMode(true, position); return true; } /** * 移除歌曲 * * @param ids */ public void remove(final Integer[] ids) { final CheckBox cb = (CheckBox) getActivity().getLayoutInflater() .inflate(R.layout.deleteoption, null); new AlertDialog.Builder(getActivity()) .setTitle("Remove/Delete " + ids.length + " Files").setView(cb) .setPositiveButton("YES", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new Thread(new Runnable() { @Override public void run() { if (cb.isChecked()) {// 物理删除 File[] files = MediaDatabase.GetPaths(ids);// 获取物理路径 for (File f : files) { new File(f.getPath()).delete();// 删除SD卡上物理文件 } } for (int id : ids) { MediaDatabase.removeAudio(id);// 删除数据库记录 } handler.sendEmptyMessage(0); } }).start(); } }).setNegativeButton("NO", null).show(); } }