两个Activity间传递list<bean>对象

本文介绍如何在Android应用中两个Activity之间传递一个包含自定义Bean对象的List。Bean对象需实现Serializable接口,List类型应为ArrayList。通过Intent的putExtra方法进行数据传递,并在接收方使用getSerializableExtra获取。
两个activity直接需要传一个list<Bean> 有几点需要注意

1、Bean 要 implements Serializable或者继承Parcelable,我这里举得例子是前者, 
2、list本身要指定成ArrayList  如:ArrayList<bean> list = null;
3、传值的activity端  i.putExtra("aaa", Arraylist实例); 
4、接受段activity端  (ArrayList<Bean>) getIntent().getSerializableExtra("aaa"); 
activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginBottom="4dp" android:background="@color/gray" android:gravity="center_vertical"> <TextView android:id="@+id/tv_order" style="@style/tvNavigationBarStyle" android:text="点菜" android:textColor="@android:color/black" /> <TextView android:id="@+id/tv_discuss" style="@style/tvNavigationBarStyle" android:layout_toRightOf="@id/tv_order" android:text="评价" android:textColor="@color/dark_gray" /> <TextView android:id="@+id/tv_business" style="@style/tvNavigationBarStyle" android:layout_toRightOf="@id/tv_discuss" android:text="商家" android:textColor="@color/dark_gray" /> <TextView android:layout_width="70dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_marginRight="15dp" android:background="@drawable/friend_list" android:gravity="center" android:text="好友拼单" android:textColor="#ef842c" android:textSize="12sp" /> </RelativeLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <fragment android:id="@+id/left" android:name="cn.itcast.menu.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" tools:layout="@layout/left_layout" /> <fragment android:id="@+id/right" android:name="cn.itcast.menu.RightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" tools:layout="@layout/right_layout" /> </LinearLayout> </LinearLayout> left_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f7f8f9" android:gravity="center_horizontal" android:orientation="vertical"> <TextView android:id="@+id/tv_recommend" style="@style/tvLeftStyle" android:text="推荐" android:background="@android:color/white"/> <TextView android:id="@+id/tv_must_buy" style="@style/tvLeftStyle" android:text="进店必买" /> </LinearLayout> list_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="4dp"> <ImageView android:id="@+id/iv_img" android:layout_width="70dp" android:layout_height="70dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:orientation="vertical"> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="2dp" android:textColor="@android:color/black" android:textSize="14sp" /> <TextView android:id="@+id/tv_sale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#868788" android:textSize="12sp" /> <TextView android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:textColor="#e85b4d" android:textSize="12sp" /> </LinearLayout> </LinearLayout> right_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:orientation="vertical"> <ListView android:id="@+id/lv_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@null"/> </LinearLayout> FoodBean.java package cn.itcast.menu; import java.io.Serializable; public class FoodBean implements Serializable { //序列化时保持FoodBean类版本的兼容性 private static final long serialVersionUID = 1L; private String name; //菜品名称 private String sales; //月售信息 private String price; //菜品价格 private int img; //菜品图片 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSales() { return sales; } public void setSales(String sales) { this.sales = sales; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public int getImg() { return img; } public void setImg(int img) { this.img = img; } } LeftFragment.java import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class LeftFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.left_layout,container,false); return view; } @Override public void onPause() { super.onPause(); } } RightAdapter.java import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class RightAdapter extends BaseAdapter { private Context mContext; private List<FoodBean> list; public RightAdapter(Context context ,List<FoodBean> list) { this.mContext = context; this.list=list; } @Override public int getCount() { //获取列表条目的总数 return list.size(); //返回ListView 条目的总数 } @Override public Object getItem(int position) { return list.get(position); //返回列表条目的数据对象 } @Override public long getItemId(int position) { return position; //返回列表条目的id } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = View.inflate(mContext, R.layout.list_item, null); holder = new ViewHolder(); holder.tv_name = convertView.findViewById(R.id.tv_name); holder.tv_sale = convertView.findViewById(R.id.tv_sale); holder.tv_price = convertView.findViewById(R.id.tv_price); holder.iv_img = convertView.findViewById(R.id.iv_img); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } FoodBean bean=list.get(position); holder.tv_name.setText(bean.getName()); holder.tv_sale.setText(bean.getSales()); holder.tv_price.setText(bean.getPrice()); holder.iv_img.setBackgroundResource(bean.getImg()); return convertView; } class ViewHolder { TextView tv_name, tv_sale,tv_price; ImageView iv_img; } } RightFragment.java import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import java.io.Serializable; import java.util.List; public class RightFragment extends Fragment { private ListView lv_list; public RightFragment() { } public RightFragment getInstance(List<FoodBean> list) { RightFragment rightFragment = new RightFragment(); //通过Bundle对象传递数据可以保证在设备横竖屏切换时传递的数据不丢失 Bundle bundle = new Bundle(); //将需要传递的字符串以键值对的形式传入bundle对象 bundle.putSerializable("list", (Serializable) list); rightFragment.setArguments(bundle); return rightFragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.right_layout, container, false); lv_list = view.findViewById(R.id.lv_list); if (getArguments() != null) { List<FoodBean> list = (List<FoodBean>) getArguments(). getSerializable("list"); RightAdapter adapter = new RightAdapter(getActivity(), list); lv_list.setAdapter(adapter); } return view; } } MainActivity.java import android.app.FragmentManager; import android.app.FragmentTransaction; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { private FragmentManager fragmentManager; private FragmentTransaction fragmentTransaction; private LeftFragment leftFragment; private TextView tv_recommend, tv_must_buy; private RightFragment rightFragment; //推荐菜单列表数据 private String[] names1 = {"爆款*肥牛鱼豆腐骨肉相连三荤五素一份米饭", "豪华双人套餐", "【热销】双人套餐(含两份米饭)"}; private String[] sales1 = {"月售520 好评度80%", "月售184 好评度68%", "月售114 好评度60%"}; private String[] prices1 = {"¥23", "¥41", "¥32"}; private int[] imgs1 = {R.drawable.recom_one, R.drawable.recom_two, R.drawable.recom_three}; //进店必买菜单列表数据 private String[] names2 = {"'蔬菜主义'1人套餐", "2人经典套餐", "3人经典套餐"}; private String[] sales2 = {"月售26 好评度70%", "月售12 好评度50%", "月售4 好评度40%"}; private String[] prices2 = {"¥44", "¥132", "¥180"}; private int[] imgs2 = {R.drawable.must_buy_one, R.drawable.must_buy_two, R.drawable.must_buy_three}; private Map<String,List<FoodBean>> map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setData(); init(); clickEvent(); } private void init() { fragmentManager = getFragmentManager();//获取fragmentManager //通过findFragmentById()方法获取leftFragment leftFragment = (LeftFragment) fragmentManager.findFragmentById(R.id.left); //获取左侧菜单栏中的控件 tv_recommend = leftFragment.getView().findViewById(R.id.tv_recommend); tv_must_buy = leftFragment.getView().findViewById(R.id.tv_must_buy); } private void setData(){ map=new HashMap<>(); List<FoodBean> list1=new ArrayList<>(); List<FoodBean> list2=new ArrayList<>(); for (int i=0;i<names1.length;i++){ FoodBean bean=new FoodBean(); bean.setName(names1[i]); bean.setSales(sales1[i]); bean.setPrice(prices1[i]); bean.setImg(imgs1[i]); list1.add(bean); } map.put("1",list1);//将推荐菜单列表的数据添加到map集合中 for (int i=0;i<names2.length;i++){ FoodBean bean=new FoodBean(); bean.setName(names2[i]); bean.setSales(sales2[i]); bean.setPrice(prices2[i]); bean.setImg(imgs2[i]); list2.add(bean); } map.put("2",list2); //将进店必买菜单列表的数据添加到map集合中 } private void clickEvent() { tv_recommend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //调用switchData()方法填充Rightfragment中的数据 switchData(map.get("1")); tv_recommend.setBackgroundColor(Color.WHITE); tv_must_buy.setBackgroundResource(R.color.gray); } }); tv_must_buy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switchData(map.get("2")); tv_must_buy.setBackgroundColor(Color.WHITE); tv_recommend.setBackgroundResource(R.color.gray); } }); //设置首次进入界面后,默认需要显示的数据 switchData(map.get("1")); } /** * 填充Activity右侧的Fragment,并传递列表数据list */ public void switchData(List<FoodBean> list) { fragmentManager = getFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction();//开启一个事务 //通过调用getInstance()方法实例化RightFragment rightFragment = new RightFragment().getInstance(list); //调用replace()方法 fragmentTransaction.replace(R.id.right, rightFragment); fragmentTransaction.commit(); } } 说明如何编写列表显示的代码
11-08
如下所示,下面是管理插入设备的USB功能的部分代码,能为我分析一下getServerInfoData()和getUsbSettingInfoData()的区别吗 函数定义: fun getServerInfoData(): LiveData<Resource<MpAdUsbServerInfoBean?>?> fun getUsbSettingInfoData(): LiveData<Resource<MpAdUsbSettingBean?>?> 相关字段 data class MpAdUsbServerInfoBean( /** * USB 认证信息 * 支持 usb_service 组件时,没有此字段;对于 usb_storage 组件,有此字段 */ var authentication: MpAdAuthenticationBean? = null, /** * SMB 服务名称 * 限制长度1-15位ASCII字符,可包含字母、数字及-_ */ var serverName: String? = null, /** * 媒体服务设置 */ var mediaServer: MpAdUsbServerBean? = null, /** * 网络邻居设置 */ var networkNeighbor: MpAdUsbServerBean? = null, /** * 本地 FTP */ var ftpLocal: MpAdUsbServerBean? = null, /** * 远程 FTP */ var ftpInternet: MpAdUsbServerBean? = null, /** * USB 3.0 开关 */ var interferenceReduction: MpAdInterferenceReductionBean? = null, /** * 支持 usb_service 组件时,有此字段;对于 usb_storage 组件无此字段,可理解为 usb 设备挂在 fap 设备下 */ var deviceId: String? = null ) data class MpAdUsbSettingBean( var mpAdAuthenticationBean: MpAdAuthenticationBean? = null, var serverList: List<MpAdUsbServerInfoBean>? = null ) 在viewmodel中部分调用如下: fun getServerInfoData(): LiveData<Resource<MpAdUsbServerInfoBean?>?> { if (isUsbServiceSupport()) { return mUsbRepository.getUsbSettingInfoData().map( { input -> getServerInfoFromId(mDeviceId, input) }) } return mUsbRepository.getServerInfoData() } fun isServerNameRepeated(serverName: String): Boolean { if (!isUsbServiceSupport() || mUsbRepository.getUsbSettingInfoData() .getValue() == null || mUsbRepository.getUsbSettingInfoData().value?.data == null || mUsbRepository.getUsbSettingInfoData().value?.data?.serverList == null ) { return false } val settingBean: MpAdUsbSettingBean? = mUsbRepository.getUsbSettingInfoData().value?.data val serverListTemp = settingBean?.serverList if (serverListTemp != null) { for (serverBean: MpAdUsbServerInfoBean in serverListTemp) { if (mDeviceId != serverBean.deviceId && serverName == serverBean.serverName) { return true } } } return false }
11-22
package com.weishitechsub.quanminchangKmianfei.fragment.specail; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.listener.OnItemClickListener; import com.hfd.common.util.ToastUtil; import com.weishitechsub.quanminchangKmianfei.R; import com.weishitechsub.quanminchangKmianfei.adtakubase.activity.BaseBindActivity; import com.weishitechsub.quanminchangKmianfei.bean.DownloadedSong; import com.weishitechsub.quanminchangKmianfei.bean.MusicBean; import com.weishitechsub.quanminchangKmianfei.bean.SongBean; import com.weishitechsub.quanminchangKmianfei.databinding.ActivityLoveBinding; import com.weishitechsub.quanminchangKmianfei.dialog.CustomBottomDialog; import com.weishitechsub.quanminchangKmianfei.dialog.PermissionDialog; import com.weishitechsub.quanminchangKmianfei.fragment.Adapter.DownloadedSongsAdapter; import com.weishitechsub.quanminchangKmianfei.fragment.Adapter.SongAdapter; import com.weishitechsub.quanminchangKmianfei.fragment.Adapter.WorksListAdapter; import com.weishitechsub.quanminchangKmianfei.fragment.lilv.LiLvFragment; import com.weishitechsub.quanminchangKmianfei.fragment.lilv.SingActivity; import com.weishitechsub.quanminchangKmianfei.utils.LocalData; import com.weishitechsub.quanminchangKmianfei.utils.MusicCache; import com.weishitechsub.quanminchangKmianfei.utils.OnMultiClickListener; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import pub.devrel.easypermissions.EasyPermissions; public class LoveActivity extends BaseBindActivity<ActivityLoveBinding> implements SongAdapter.OnIvClickListener, EasyPermissions.PermissionCallbacks,DownloadedSongsAdapter.OnDownloadedIvClickListener { private int type; private String title; private TextView tvTitle; private SongAdapter songAdapter; WorksListAdapter singAdapter; WorksListAdapter oratoriAdapter; private int pos; private AlertDialog progressDialog; private static final String[] PERMS_CAMERA = new String[] {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}; // 需要请求的权限数组 private static final int RC_CAMERA_PERM = 123; // 请求码,唯一标识 private List<DownloadedSong> dataList = new ArrayList<>(); private DownloadedSongsAdapter downloadedSongsAdapter; @Override protected void init() { tvTitle = mBinding.tvTitle; Intent intent = getIntent(); if (intent != null) { type = intent.getIntExtra("type", 0); title = intent.getStringExtra("title"); } setOnData(); setOnClick(); setupRecyclerView(); // 初始化列表 } private void setupRecyclerView() { mBinding.rv.setLayoutManager(new LinearLayoutManager(this)); if (type == 0) { // 显示收藏列表 List<MusicBean.DataBean> favorites = MusicCache.getFavoriteList(this); songAdapter = new SongAdapter(favorites); songAdapter.setOnIvClickListener(this); mBinding.rv.setAdapter(songAdapter); } else if (type == 1){ //显示下载本地歌曲 mBinding.rv.setLayoutManager(new LinearLayoutManager(this)); downloadedSongsAdapter = new DownloadedSongsAdapter(dataList); downloadedSongsAdapter.setDownloadedOnIvClickListener(this); mBinding.rv.setAdapter(downloadedSongsAdapter); loadDownloadedSongs(); } else if (type == 2){ // 显示K歌记录列表 mBinding.rv.setLayoutManager(new LinearLayoutManager(this)); singAdapter = new WorksListAdapter(new ArrayList<>()); // 你的适配器类 mBinding.rv.setAdapter(singAdapter); List<SongBean> songBeanList = LocalData.getInstance().getSongList(); if (null == songBeanList) { songBeanList = new ArrayList<>(); } if (songBeanList.size() > 0) { singAdapter.getData().clear(); singAdapter.setNewData(songBeanList); singAdapter.notifyDataSetChanged(); } else { singAdapter.setNewData(null); // singAdapter.setEmptyView(R.layout.empty_work_view); } singAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { //处理多选逻辑 Bundle bundle = new Bundle(); bundle.putString("filePath", singAdapter.getData().get(position).getSongFilePath()); bundle.putString("songName", singAdapter.getData().get(position).getSongName()); toClass(PlayActivity.class, bundle); } }); }else { mBinding.rv.setLayoutManager(new LinearLayoutManager(LoveActivity.this)); if (null == oratoriAdapter) { oratoriAdapter = new WorksListAdapter(new ArrayList<>()); // 你的适配器类 } mBinding.rv.setAdapter(oratoriAdapter); List<SongBean> songBeanList = LocalData.getInstance().getOratoriList(); if (null == songBeanList) { songBeanList = new ArrayList<>(); } if (songBeanList.size() > 0) { oratoriAdapter.getData().clear(); oratoriAdapter.setNewData(songBeanList); oratoriAdapter.notifyDataSetChanged(); } else { oratoriAdapter.setNewData(null); // oratoriAdapter.setEmptyView(R.layout.empty_work_view); } oratoriAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { Bundle bundle = new Bundle(); bundle.putString("filePath", oratoriAdapter.getData().get(position).getSongFilePath()); bundle.putString("songName", oratoriAdapter.getData().get(position).getSongName()); toClass(PlayActivity.class, bundle); } }); } } private void loadDownloadedSongs() { dataList.clear(); List<DownloadedSong> list = MusicCache.getDownloadedList(this); dataList.addAll(list); downloadedSongsAdapter.notifyDataSetChanged(); } private void setOnClick() { mBinding.iv.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { finish(); } }); } public void setOnData(){ if (type == 0) { tvTitle.setText(title); }else if (type == 1){ tvTitle.setText(title); }else if (type == 2){ tvTitle.setText(title); }else { tvTitle.setText(title); } } @Override public void onIvClick(int position, ImageView iv_gd) { iv_gd.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { CustomBottomDialog dialog = new CustomBottomDialog(LoveActivity.this); MusicBean.DataBean song = songAdapter.getItem(position); dialog.setTitle(song.getTitle(),song.getSinger(),song.getCover(),song.isCollected()); //去演唱点击事件 dialog.setOnYcClickListener(new CustomBottomDialog.OnYcClickListener() { @Override public void onYcClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", song); // 直接传递 Serializable 对象 startActivity(intent); } }); //去k歌点击事件 dialog.setOnKgClickListener(new CustomBottomDialog.OnKgClickListener() { @Override public void onKgClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", song); startActivity(intent); } }); //下载歌曲点击事件 dialog.setOnDownloadClickListener(new CustomBottomDialog.OnDownloadClickListener() { @Override public void onDownloadClick() { pos = position; getSavePermissions(position); } }); //收藏点击事件 dialog.setOnLikeClickListener(new CustomBottomDialog.OnLikeClickListener() { @Override public void onLikeClick() { // 切换收藏状态 boolean nowCollected = !song.isCollected(); song.setCollected(nowCollected); dialog.updateLikeStatus(nowCollected); // 实时更新界面 if (nowCollected) { MusicCache.addFavorite(LoveActivity.this, song); } else { MusicCache.removeFavorite(LoveActivity.this, song); } ToastUtil.showShortToast(nowCollected ? "已收藏" : "已取消收藏"); } }); dialog.show(); } }); } @Override public void onDownloadedIvClick(int position, ImageView iv_gd) { iv_gd.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { CustomBottomDialog dialog = new CustomBottomDialog(LoveActivity.this); DownloadedSong item = downloadedSongsAdapter.getItem(position); dialog.setTitle(item.getTitle(),item.getSinger(),item.getCoverUrl(),item.isCollected()); //去演唱点击事件 dialog.setOnYcClickListener(new CustomBottomDialog.OnYcClickListener() { @Override public void onYcClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", item); // 直接传递 Serializable 对象 startActivity(intent); } }); //去k歌点击事件 dialog.setOnKgClickListener(new CustomBottomDialog.OnKgClickListener() { @Override public void onKgClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", item); startActivity(intent); } }); //下载歌曲点击事件 dialog.setOnDownloadClickListener(new CustomBottomDialog.OnDownloadClickListener() { @Override public void onDownloadClick() { pos = position; getSavePermissions(position); } }); //收藏点击事件 dialog.setOnLikeClickListener(new CustomBottomDialog.OnLikeClickListener() { @Override public void onLikeClick() { // 切换收藏状态 boolean nowCollected = !item.isCollected(); item.setCollected(nowCollected); dialog.updateLikeStatus(nowCollected); // 实时更新界面 if (nowCollected) { MusicCache.addFavorite(LoveActivity.this, item); } else { MusicCache.removeFavorite(LoveActivity.this, item); } ToastUtil.showShortToast(nowCollected ? "已收藏" : "已取消收藏"); } }); dialog.show(); } }); } private void getSavePermissions(int position) { // 检查并请求权限 if (!EasyPermissions.hasPermissions(LoveActivity.this, PERMS_CAMERA)) { new PermissionDialog(LoveActivity.this,"权限说明:由于下载歌曲,需要相应的存储权限。拒绝将无法使用此功能").show(); EasyPermissions.requestPermissions(LoveActivity.this, "需要相应的存储权限", RC_CAMERA_PERM, PERMS_CAMERA); } else { saveSongAtPosition(position); //开始下载指定位置的歌曲 } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { if(requestCode == RC_CAMERA_PERM){ saveSongAtPosition(pos); } } @Override public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { } private void saveSongAtPosition(int position) { MusicBean.DataBean song = songAdapter.getItem(position); if (song == null) { ToastUtil.showShortToast("无效的歌曲信息"); return; } if (song.getMusic() == null || song.getMusic().isEmpty()) { ToastUtil.showShortToast("歌曲地址无效"); return; } showProgressDialog(LoveActivity.this); new SaveTask(song).execute(); // 启动异步任务下载 } private void showProgressDialog(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("正在保存..."); builder.setCancelable(false); progressDialog = builder.create(); progressDialog.show(); } private class SaveTask extends AsyncTask<Void, Void, Boolean> { private final MusicBean.DataBean song; private String targetPath; private Exception exception; SaveTask(MusicBean.DataBean song) { this.song = song; } @Override protected Boolean doInBackground(Void... voids) { try { String urlStr = song.getMusic(); String fileName = song.getTitle(); if (fileName == null) fileName = "music_" + System.currentTimeMillis(); File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); if (!dir.exists()) dir.mkdirs(); targetPath = new File(dir, fileName + ".mp3").getAbsolutePath(); InputStream inputStream = new java.net.URL(urlStr).openStream(); FileOutputStream outStream = new FileOutputStream(targetPath); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } outStream.flush(); outStream.close(); inputStream.close(); // 通知媒体库刷新 Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); scanIntent.setData(Uri.fromFile(new File(targetPath))); sendBroadcast(scanIntent); return true; } catch (Exception e) { e.printStackTrace(); exception = e; return false; } } @Override protected void onPostExecute(Boolean success) { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } if (success) { Toast.makeText(LoveActivity.this, "音乐已保存至: " + targetPath, Toast.LENGTH_LONG).show(); } else { Toast.makeText(LoveActivity.this, "保存失败: " + (exception != null ? exception.getMessage() : "未知错误"), Toast.LENGTH_SHORT).show(); } } } @Override public void onResume() { super.onResume(); // 每次进入都刷新(以防新增了) loadDownloadedSongs(); } }package com.weishitechsub.quanminchangKmianfei.utils; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import androidx.annotation.Nullable; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.weishitechsub.quanminchangKmianfei.LCAppcation; import com.weishitechsub.quanminchangKmianfei.bean.DownloadedSong; import com.weishitechsub.quanminchangKmianfei.bean.MusicBean; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class MusicCache { // === 持久化键名 === private static final String KEY_FAVORITE_LIST = "music_cache_favorite_list"; // === 内存缓存(提高性能)=== private static List<MusicBean.DataBean> mainMusicList; private static List<MusicBean.DataBean> favoriteList; // 缓存收藏列表 private static MusicBean.DataBean currentPlayingSong; private static int currentPosition = -1; private static final String KEY_DOWNLOADED_SONGS = "downloaded_songs";//下载 // === 获取 SharedPreferences 的方法 === private static android.content.SharedPreferences getSP(Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } // === 主音乐列表操作 === public static void setMainMusicList(List<MusicBean.DataBean> list) { if (list != null) { mainMusicList = new ArrayList<>(list); } else { mainMusicList = null; } } @Nullable public static List<MusicBean.DataBean> getMainMusicList() { return mainMusicList; } @Nullable public static MusicBean.DataBean getMusicAt(int position) { if (mainMusicList == null || position < 0 || position >= mainMusicList.size()) { return null; } return mainMusicList.get(position); } // === 当前播放歌曲操作 === public static void setCurrentPlayingSong(MusicBean.DataBean song, int position) { currentPlayingSong = song; currentPosition = position; } public static MusicBean.DataBean getCurrentPlayingSong() { return currentPlayingSong; } public static int getCurrentPlayingPosition() { return currentPosition; } public static void clearCurrentPlaying() { currentPlayingSong = null; currentPosition = -1; } // === 收藏列表操作(重点新增部分)=== /** * 获取收藏列表(优先从内存读,内存为空则从 SP 加载) */ public static List<MusicBean.DataBean> getFavoriteList(Context context) { if (context == null) return new ArrayList<>(); // 不再依赖内存缓存!每次从 SP 读取最真实的数据 return loadFavoriteListFromSP(context); } /** * 添加歌曲到收藏列表 */ public static void addFavorite(Context context, MusicBean.DataBean song) { if (context == null || song == null) return; List<MusicBean.DataBean> list = getFavoriteList(context); if (!list.contains(song)) { list.add(song); saveFavoriteListToSP(context, list); // 立即写入 SP } // 更新内存缓存(可选) favoriteList = new ArrayList<>(list); } /** * 从收藏列表移除歌曲 */ public static void removeFavorite(Context context, MusicBean.DataBean song) { if (context == null || song == null) return; List<MusicBean.DataBean> list = getFavoriteList(context); if (list.remove(song)) { saveFavoriteListToSP(context, list); // 立即写入 SP } // 更新内存缓存 favoriteList = new ArrayList<>(list); } /** * 判断某首歌是否已收藏 */ public static boolean isFavorite(MusicBean.DataBean song) { if (song == null) return false; Context context = LCAppcation.getInstance(); if (context == null) return false; List<MusicBean.DataBean> list = getFavoriteList(context); return list.contains(song); } /** * 清空收藏列表 */ public static void clearFavoriteList(Context context) { saveFavoriteListToSP(context, new ArrayList<>()); favoriteList = new ArrayList<>(); } // === 私有方法:持久化读写 === private static List<MusicBean.DataBean> loadFavoriteListFromSP(Context context) { String json = getSP(context).getString(KEY_FAVORITE_LIST, "[]"); Log.d("MusicCache", "从 SP 读取收藏列表: " + json); Type type = new TypeToken<List<MusicBean.DataBean>>(){}.getType(); Gson gson = new Gson(); try { List<MusicBean.DataBean> list = gson.fromJson(json, type); return list != null ? list : new ArrayList<>(); } catch (Exception e) { e.printStackTrace(); return new ArrayList<>(); } } private static void saveFavoriteListToSP(Context context, List<MusicBean.DataBean> list) { Gson gson = new Gson(); String json = gson.toJson(list); Log.d("MusicCache", "正在保存收藏列表: " + json); getSP(context).edit().putString(KEY_FAVORITE_LIST, json).apply(); } public static void syncCollectionStatus(List<MusicBean.DataBean> songs, Context context) { if (songs == null || context == null) return; List<MusicBean.DataBean> favorites = getFavoriteList(context); // 从 SP 读出所有已收藏歌曲 for (MusicBean.DataBean song : songs) { boolean collected = favorites.contains(song); // 判断是否在收藏列表里 song.setCollected(collected); // 更新 UI 状态 } } // 保存已下载歌曲列表 public static void saveDownloadedList(Context context, List<DownloadedSong> list) { SharedPreferences sp = context.getSharedPreferences("app_data", Context.MODE_PRIVATE); Gson gson = new Gson(); String json = gson.toJson(list); sp.edit().putString(KEY_DOWNLOADED_SONGS, json).apply(); } // 获取已下载歌曲列表 public static List<DownloadedSong> getDownloadedList(Context context) { SharedPreferences sp = context.getSharedPreferences("app_data", Context.MODE_PRIVATE); String json = sp.getString(KEY_DOWNLOADED_SONGS, null); if (json == null) { return new ArrayList<>(); } Gson gson = new Gson(); Type type = new TypeToken<List<DownloadedSong>>(){}.getType(); return gson.fromJson(json, type); } // 清空下载记录(可选) public static void clearDownloadList(Context context) { SharedPreferences sp = context.getSharedPreferences("app_data", Context.MODE_PRIVATE); sp.edit().remove(KEY_DOWNLOADED_SONGS).apply(); } } 增加两个 MusicCache.addFavorite(LoveActivity.this, item); MusicCache.removeFavorite(LoveActivity.this, item);添加这个DownloadedSong类的方法
12-12
package com.weishitechsub.quanminchangKmianfei.utils; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import androidx.annotation.Nullable; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.weishitechsub.quanminchangKmianfei.LCAppcation; import com.weishitechsub.quanminchangKmianfei.bean.DownloadedSong; import com.weishitechsub.quanminchangKmianfei.bean.MusicBean; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class MusicCache { // === 持久化键名 === private static final String KEY_FAVORITE_LIST = "music_cache_favorite_list"; // === 内存缓存(提高性能)=== private static List<MusicBean.DataBean> mainMusicList; private static List<MusicBean.DataBean> favoriteList; // 缓存收藏列表 private static MusicBean.DataBean currentPlayingSong; private static int currentPosition = -1; private static final String KEY_DOWNLOADED_SONGS = "downloaded_songs";//下载 // === 获取 SharedPreferences 的方法 === private static android.content.SharedPreferences getSP(Context context) { return PreferenceManager.getDefaultSharedPreferences(context); } // === 主音乐列表操作 === public static void setMainMusicList(List<MusicBean.DataBean> list) { if (list != null) { mainMusicList = new ArrayList<>(list); } else { mainMusicList = null; } } @Nullable public static List<MusicBean.DataBean> getMainMusicList() { return mainMusicList; } @Nullable public static MusicBean.DataBean getMusicAt(int position) { if (mainMusicList == null || position < 0 || position >= mainMusicList.size()) { return null; } return mainMusicList.get(position); } // === 当前播放歌曲操作 === public static void setCurrentPlayingSong(MusicBean.DataBean song, int position) { currentPlayingSong = song; currentPosition = position; } public static MusicBean.DataBean getCurrentPlayingSong() { return currentPlayingSong; } public static int getCurrentPlayingPosition() { return currentPosition; } public static void clearCurrentPlaying() { currentPlayingSong = null; currentPosition = -1; } // === 收藏列表操作(重点新增部分)=== /** * 获取收藏列表(优先从内存读,内存为空则从 SP 加载) */ public static List<MusicBean.DataBean> getFavoriteList(Context context) { if (context == null) return new ArrayList<>(); // 不再依赖内存缓存!每次从 SP 读取最真实的数据 return loadFavoriteListFromSP(context); } /** * 添加歌曲到收藏列表 */ public static void addFavorite(Context context, MusicBean.DataBean song) { if (context == null || song == null) return; List<MusicBean.DataBean> list = getFavoriteList(context); if (!list.contains(song)) { list.add(song); saveFavoriteListToSP(context, list); // 立即写入 SP } // 更新内存缓存(可选) favoriteList = new ArrayList<>(list); } /** * 从收藏列表移除歌曲 */ public static void removeFavorite(Context context, MusicBean.DataBean song) { if (context == null || song == null) return; List<MusicBean.DataBean> list = getFavoriteList(context); if (list.remove(song)) { saveFavoriteListToSP(context, list); // 立即写入 SP } // 更新内存缓存 favoriteList = new ArrayList<>(list); } /** * 判断某首歌是否已收藏 */ public static boolean isFavorite(MusicBean.DataBean song) { if (song == null) return false; Context context = LCAppcation.getInstance(); if (context == null) return false; List<MusicBean.DataBean> list = getFavoriteList(context); return list.contains(song); } /** * 清空收藏列表 */ public static void clearFavoriteList(Context context) { saveFavoriteListToSP(context, new ArrayList<>()); favoriteList = new ArrayList<>(); } // === 私有方法:持久化读写 === private static List<MusicBean.DataBean> loadFavoriteListFromSP(Context context) { String json = getSP(context).getString(KEY_FAVORITE_LIST, "[]"); Log.d("MusicCache", "从 SP 读取收藏列表: " + json); Type type = new TypeToken<List<MusicBean.DataBean>>(){}.getType(); Gson gson = new Gson(); try { List<MusicBean.DataBean> list = gson.fromJson(json, type); return list != null ? list : new ArrayList<>(); } catch (Exception e) { e.printStackTrace(); return new ArrayList<>(); } } private static void saveFavoriteListToSP(Context context, List<MusicBean.DataBean> list) { Gson gson = new Gson(); String json = gson.toJson(list); Log.d("MusicCache", "正在保存收藏列表: " + json); getSP(context).edit().putString(KEY_FAVORITE_LIST, json).apply(); } public static void syncCollectionStatus(List<MusicBean.DataBean> songs, Context context) { if (songs == null || context == null) return; List<MusicBean.DataBean> favorites = getFavoriteList(context); // 从 SP 读出所有已收藏歌曲 for (MusicBean.DataBean song : songs) { boolean collected = favorites.contains(song); // 判断是否在收藏列表里 song.setCollected(collected); // 更新 UI 状态 } } // 保存已下载歌曲列表 public static void saveDownloadedList(Context context, List<DownloadedSong> list) { SharedPreferences sp = context.getSharedPreferences("app_data", Context.MODE_PRIVATE); Gson gson = new Gson(); String json = gson.toJson(list); sp.edit().putString(KEY_DOWNLOADED_SONGS, json).apply(); } // 获取已下载歌曲列表 public static List<DownloadedSong> getDownloadedList(Context context) { SharedPreferences sp = context.getSharedPreferences("app_data", Context.MODE_PRIVATE); String json = sp.getString(KEY_DOWNLOADED_SONGS, null); if (json == null) { return new ArrayList<>(); } Gson gson = new Gson(); Type type = new TypeToken<List<DownloadedSong>>(){}.getType(); return gson.fromJson(json, type); } // 清空下载记录(可选) public static void clearDownloadList(Context context) { SharedPreferences sp = context.getSharedPreferences("app_data", Context.MODE_PRIVATE); sp.edit().remove(KEY_DOWNLOADED_SONGS).apply(); } /** * 兼容 DownloadedSong:将其转为 MusicBean.DataBean 进行收藏 * 不修改任何原有逻辑,仅做桥接 */ public static void addFavorite(Context context, DownloadedSong song) { if (context == null || song == null) return; MusicBean.DataBean fakeBean = new MusicBean.DataBean(); fakeBean.setTitle(song.getTitle()); fakeBean.setSinger(song.getSinger()); fakeBean.setCover(song.getCover()); // 假设有 getCoverUrl() fakeBean.setMusic(song.getMusic()); fakeBean.setLrc(song.getLrc()); addFavorite(context, fakeBean); // 复用原有逻辑 } public static void removeFavorite(Context context, DownloadedSong song) { if (context == null || song == null) return; MusicBean.DataBean fakeBean = new MusicBean.DataBean(); fakeBean.setTitle(song.getTitle()); fakeBean.setSinger(song.getSinger()); removeFavorite(context, fakeBean); } public static boolean isFavorite(DownloadedSong song) { if (song == null) return false; MusicBean.DataBean fakeBean = new MusicBean.DataBean(); fakeBean.setTitle(song.getTitle()); fakeBean.setSinger(song.getSinger()); return isFavorite(fakeBean); } } package com.weishitechsub.quanminchangKmianfei.fragment.specail; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.listener.OnItemClickListener; import com.hfd.common.util.ToastUtil; import com.weishitechsub.quanminchangKmianfei.R; import com.weishitechsub.quanminchangKmianfei.adtakubase.activity.BaseBindActivity; import com.weishitechsub.quanminchangKmianfei.bean.DownloadedSong; import com.weishitechsub.quanminchangKmianfei.bean.MusicBean; import com.weishitechsub.quanminchangKmianfei.bean.SongBean; import com.weishitechsub.quanminchangKmianfei.databinding.ActivityLoveBinding; import com.weishitechsub.quanminchangKmianfei.dialog.CommonDeleteDialog; import com.weishitechsub.quanminchangKmianfei.dialog.CommonDialog; import com.weishitechsub.quanminchangKmianfei.dialog.CustomBottomDialog; import com.weishitechsub.quanminchangKmianfei.dialog.PermissionDialog; import com.weishitechsub.quanminchangKmianfei.fragment.Adapter.DownloadedSongsAdapter; import com.weishitechsub.quanminchangKmianfei.fragment.Adapter.SongAdapter; import com.weishitechsub.quanminchangKmianfei.fragment.Adapter.WorksListAdapter; import com.weishitechsub.quanminchangKmianfei.fragment.lilv.LiLvFragment; import com.weishitechsub.quanminchangKmianfei.fragment.lilv.SingActivity; import com.weishitechsub.quanminchangKmianfei.utils.LocalData; import com.weishitechsub.quanminchangKmianfei.utils.MusicCache; import com.weishitechsub.quanminchangKmianfei.utils.OnMultiClickListener; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import pub.devrel.easypermissions.EasyPermissions; public class LoveActivity extends BaseBindActivity<ActivityLoveBinding> implements SongAdapter.OnIvClickListener, EasyPermissions.PermissionCallbacks,DownloadedSongsAdapter.OnDownloadedIvClickListener { private int type; private String title; private TextView tvTitle; private SongAdapter songAdapter; WorksListAdapter singAdapter; WorksListAdapter oratoriAdapter; private int pos; private AlertDialog progressDialog; private static final String[] PERMS_CAMERA = new String[] {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}; // 需要请求的权限数组 private static final int RC_CAMERA_PERM = 123; // 请求码,唯一标识 private List<DownloadedSong> dataList = new ArrayList<>(); private DownloadedSongsAdapter downloadedSongsAdapter; @Override protected void init() { tvTitle = mBinding.tvTitle; Intent intent = getIntent(); if (intent != null) { type = intent.getIntExtra("type", 0); title = intent.getStringExtra("title"); } setOnData(); setOnClick(); setupRecyclerView(); // 初始化列表 } private void setupRecyclerView() { mBinding.rv.setLayoutManager(new LinearLayoutManager(this)); if (type == 0) { // 显示收藏列表 List<MusicBean.DataBean> favorites = MusicCache.getFavoriteList(this); songAdapter = new SongAdapter(favorites); songAdapter.setOnIvClickListener(this); mBinding.rv.setAdapter(songAdapter); } else if (type == 1){ //显示下载本地歌曲 mBinding.rv.setLayoutManager(new LinearLayoutManager(this)); downloadedSongsAdapter = new DownloadedSongsAdapter(dataList); downloadedSongsAdapter.setDownloadedOnIvClickListener(this); mBinding.rv.setAdapter(downloadedSongsAdapter); loadDownloadedSongs(); } else if (type == 2){ // 显示K歌记录列表 mBinding.rv.setLayoutManager(new LinearLayoutManager(this)); singAdapter = new WorksListAdapter(new ArrayList<>()); // 你的适配器类 mBinding.rv.setAdapter(singAdapter); List<SongBean> songBeanList = LocalData.getInstance().getSongList(); if (null == songBeanList) { songBeanList = new ArrayList<>(); } if (songBeanList.size() > 0) { singAdapter.getData().clear(); singAdapter.setNewData(songBeanList); singAdapter.notifyDataSetChanged(); } else { singAdapter.setNewData(null); // singAdapter.setEmptyView(R.layout.empty_work_view); } singAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { //处理多选逻辑 Bundle bundle = new Bundle(); bundle.putString("filePath", singAdapter.getData().get(position).getSongFilePath()); bundle.putString("songName", singAdapter.getData().get(position).getSongName()); toClass(PlayActivity.class, bundle); } }); }else { mBinding.rv.setLayoutManager(new LinearLayoutManager(LoveActivity.this)); if (null == oratoriAdapter) { oratoriAdapter = new WorksListAdapter(new ArrayList<>()); // 你的适配器类 } mBinding.rv.setAdapter(oratoriAdapter); List<SongBean> songBeanList = LocalData.getInstance().getOratoriList(); if (null == songBeanList) { songBeanList = new ArrayList<>(); } if (songBeanList.size() > 0) { oratoriAdapter.getData().clear(); oratoriAdapter.setNewData(songBeanList); oratoriAdapter.notifyDataSetChanged(); } else { oratoriAdapter.setNewData(null); // oratoriAdapter.setEmptyView(R.layout.empty_work_view); } oratoriAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) { Bundle bundle = new Bundle(); bundle.putString("filePath", oratoriAdapter.getData().get(position).getSongFilePath()); bundle.putString("songName", oratoriAdapter.getData().get(position).getSongName()); toClass(PlayActivity.class, bundle); } }); } } private void loadDownloadedSongs() { dataList.clear(); List<DownloadedSong> list = MusicCache.getDownloadedList(this); dataList.addAll(list); downloadedSongsAdapter.notifyDataSetChanged(); } private void setOnClick() { mBinding.iv.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { finish(); } }); mBinding.tvSc.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { CommonDeleteDialog commonDialog = new CommonDeleteDialog(LoveActivity.this,"是否确认删除"); commonDialog.show(); commonDialog.setOnDialogClickListener(new CommonDeleteDialog.OnDialogClickListener() { @Override public void onSureClickListener() { } @Override public void onQuitClickListener() { commonDialog.dismiss(); } }); } }); } public void setOnData(){ if (type == 0) { tvTitle.setText(title); }else if (type == 1){ tvTitle.setText(title); }else if (type == 2){ tvTitle.setText(title); }else { tvTitle.setText(title); } } @Override public void onIvClick(int position, ImageView iv_gd) { iv_gd.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { CustomBottomDialog dialog = new CustomBottomDialog(LoveActivity.this); MusicBean.DataBean song = songAdapter.getItem(position); dialog.setTitle(song.getTitle(),song.getSinger(),song.getCover(),song.isCollected()); //去演唱点击事件 dialog.setOnYcClickListener(new CustomBottomDialog.OnYcClickListener() { @Override public void onYcClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", song); // 直接传递 Serializable 对象 startActivity(intent); } }); //去k歌点击事件 dialog.setOnKgClickListener(new CustomBottomDialog.OnKgClickListener() { @Override public void onKgClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", song); startActivity(intent); } }); //下载歌曲点击事件 dialog.setOnDownloadClickListener(new CustomBottomDialog.OnDownloadClickListener() { @Override public void onDownloadClick() { pos = position; getSavePermissions(position); } }); //收藏点击事件 dialog.setOnLikeClickListener(new CustomBottomDialog.OnLikeClickListener() { @Override public void onLikeClick() { // 切换收藏状态 boolean nowCollected = !song.isCollected(); song.setCollected(nowCollected); dialog.updateLikeStatus(nowCollected); // 实时更新界面 if (nowCollected) { MusicCache.addFavorite(LoveActivity.this, song); } else { MusicCache.removeFavorite(LoveActivity.this, song); } ToastUtil.showShortToast(nowCollected ? "已收藏" : "已取消收藏"); } }); dialog.show(); } }); } @Override public void onDownloadedIvClick(int position, ImageView iv_gd) { iv_gd.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { CustomBottomDialog dialog = new CustomBottomDialog(LoveActivity.this); DownloadedSong item = downloadedSongsAdapter.getItem(position); dialog.setTitle(item.getTitle(),item.getSinger(),item.getCover(),item.isCollected()); //去演唱点击事件 dialog.setOnYcClickListener(new CustomBottomDialog.OnYcClickListener() { @Override public void onYcClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", item); // 直接传递 Serializable 对象 startActivity(intent); } }); //去k歌点击事件 dialog.setOnKgClickListener(new CustomBottomDialog.OnKgClickListener() { @Override public void onKgClick() { Intent intent = new Intent(LoveActivity.this, SingActivity.class); intent.putExtra("song_data", item); startActivity(intent); } }); //下载歌曲点击事件 dialog.setOnDownloadClickListener(new CustomBottomDialog.OnDownloadClickListener() { @Override public void onDownloadClick() { pos = position; getSavePermissions(position); } }); //收藏点击事件 dialog.setOnLikeClickListener(new CustomBottomDialog.OnLikeClickListener() { @Override public void onLikeClick() { // 切换收藏状态 boolean nowCollected = !item.isCollected(); item.setCollected(nowCollected); dialog.updateLikeStatus(nowCollected); // 实时更新界面 if (nowCollected) { MusicCache.addFavorite(LoveActivity.this, item); } else { MusicCache.removeFavorite(LoveActivity.this, item); } ToastUtil.showShortToast(nowCollected ? "已收藏" : "已取消收藏"); } }); dialog.show(); } }); } private void getSavePermissions(int position) { // 检查并请求权限 if (!EasyPermissions.hasPermissions(LoveActivity.this, PERMS_CAMERA)) { new PermissionDialog(LoveActivity.this,"权限说明:由于下载歌曲,需要相应的存储权限。拒绝将无法使用此功能").show(); EasyPermissions.requestPermissions(LoveActivity.this, "需要相应的存储权限", RC_CAMERA_PERM, PERMS_CAMERA); } else { saveSongAtPosition(position); //开始下载指定位置的歌曲 } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { if(requestCode == RC_CAMERA_PERM){ saveSongAtPosition(pos); } } @Override public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { } private void saveSongAtPosition(int position) { MusicBean.DataBean song = songAdapter.getItem(position); if (song == null) { ToastUtil.showShortToast("无效的歌曲信息"); return; } if (song.getMusic() == null || song.getMusic().isEmpty()) { ToastUtil.showShortToast("歌曲地址无效"); return; } showProgressDialog(LoveActivity.this); new SaveTask(song).execute(); // 启动异步任务下载 } private void showProgressDialog(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("正在保存..."); builder.setCancelable(false); progressDialog = builder.create(); progressDialog.show(); } private class SaveTask extends AsyncTask<Void, Void, Boolean> { private final MusicBean.DataBean song; private String targetPath; private Exception exception; SaveTask(MusicBean.DataBean song) { this.song = song; } @Override protected Boolean doInBackground(Void... voids) { try { String urlStr = song.getMusic(); String fileName = song.getTitle(); if (fileName == null) fileName = "music_" + System.currentTimeMillis(); File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); if (!dir.exists()) dir.mkdirs(); targetPath = new File(dir, fileName + ".mp3").getAbsolutePath(); InputStream inputStream = new java.net.URL(urlStr).openStream(); FileOutputStream outStream = new FileOutputStream(targetPath); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } outStream.flush(); outStream.close(); inputStream.close(); // 通知媒体库刷新 Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); scanIntent.setData(Uri.fromFile(new File(targetPath))); sendBroadcast(scanIntent); return true; } catch (Exception e) { e.printStackTrace(); exception = e; return false; } } @Override protected void onPostExecute(Boolean success) { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } if (success) { Toast.makeText(LoveActivity.this, "音乐已保存至: " + targetPath, Toast.LENGTH_LONG).show(); } else { Toast.makeText(LoveActivity.this, "保存失败: " + (exception != null ? exception.getMessage() : "未知错误"), Toast.LENGTH_SHORT).show(); } } } @Override public void onResume() { super.onResume(); // 每次进入都刷新(以防新增了) if (type == 1) { loadDownloadedSongs(); } } }点击mBinding.tvSc清空我喜欢的、我下载的数据
12-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值