# recycleview的item跳转界面实现 **Repository Path**: aparece/recycleview_item ## Basic Information - **Project Name**: recycleview的item跳转界面实现 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-13 - **Last Updated**: 2023-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实验目标 将第一次实验里recyclerView的每个item增加点击功能,点击后跳转到一个新的view界面。 # 技术说明 1. 使用工具 Android studio 2. API 33 Android 13 3. 主要技术内容:recyclerview、adapter、activity、fragment,service # 设计思路 1. 将原本作业1中的fagment1改成播放器,播放音乐 2. fragment2作为列表展示音乐文件名 3. 创建一个musicactivity播放器 4. 创建myservice1来播放音乐 5. fragment2将歌名读取出来显示在recycleview中 6. myadapter将每个选项中的歌名在歌曲名单中的下标传递给musicactivity 7. musicactivity在歌名列表中查找到原本的歌名需要,将其写入到textview中 8. musicactivity根据歌曲的序号,传给myservice1 9. myservice接收参数,播放对应序号所放的歌 # 核心代码 ## 播放器 ### myservice1.java - 将歌曲对象按顺序写入列表,方便播放时调用 - 因为oncreat不接受intent参数,所以在onstartcommand中通过intent接收参数,并播放 ```java public class MyService1 extends Service { MediaPlayer player; int [] musics={ R.raw.music1, R.raw.music2, R.raw.music3, R.raw.music4 }; public MyService1() { } @Override public void onCreate(){ super.onCreate(); Log.d("xr","MyService1:onCreate..."); //player=MediaPlayer.create(this,musics[0]); //player=MediaPlayer.create(this,R.raw.music1); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("xr","MyService1:onStart..."); int musicIndex = intent.getIntExtra("musicIndex", 0); // 获取传递的参数,默认为0 player = MediaPlayer.create(this, musics[musicIndex]); player.start(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { player.stop(); player.release(); super.onDestroy(); Log.d("xr","MyService1:onDestroy..."); } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } } ``` ### musicactivity.java - 接收intent传递过来的参数,歌曲序号 - getRawSongList获取歌名列表 - 在歌名列表中根据歌曲序号将歌名显示在textview中 - 启动myservice1服务时,将歌名序号作为参数传递 - 按钮1播放,按钮2停止,按钮3返回歌单 ```java public class MusicActivity extends AppCompatActivity { int index; TextView textView; Button button1,button2,button3; List list; @Override protected void onCreate(Bundle savedInstanceState) { Log.d("test","music creat1"); super.onCreate(savedInstanceState); list=getRawSongList(); setContentView(R.layout.activity_music); textView=findViewById(R.id.textView1234); //接收传递的参数 Intent intent1=getIntent(); index=intent1.getIntExtra("index",0); Log.d("test","getintent"); button1=findViewById(R.id.buttonM11); button2=findViewById(R.id.buttonM22); button3=findViewById(R.id.button66); Log.d("test",String.valueOf(index)); textView.setText(list.get(index)); Intent intent=new Intent(MusicActivity.this,MyService1.class); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { intent.putExtra("musicIndex", index); // 设置参数 startService(intent); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(intent); } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent3 =new Intent(); finish(); } }); } public List getRawSongList() {//获取歌曲列表的名字 List list = new ArrayList<>(); Field[] fields = R.raw.class.getFields(); for (Field field : fields) { String songName = field.getName(); list.add(songName); } return list; } } ``` ### fragment1.java - 将musicactivity的代码复制到fagment1里改一下。 ```java public class Fragment1 extends Fragment { Button button1, button2; int index=1; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout1, container, false); button1 = view.findViewById(R.id.buttonM11); button2 = view.findViewById(R.id.buttonM22); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), MyService1.class); Log.d("test",String.valueOf(index)); intent.putExtra("musicIndex", index); // 设置参数 getActivity().startService(intent); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(), MyService1.class); getActivity().stopService(intent); } }); return view; } } ``` ## recycleview跳转 ### fragment2.java - 读取歌名信息列表,初始化myadapter - 将fragment2与adapter关联,绑定recycler view与item ```java public class Fragment2 extends Fragment { RecyclerView recycleview; Myadapter adapter; Context context; List list; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view=inflater.inflate(R.layout.activity_recycle_view,container,false); recycleview=view.findViewById(R.id.RecyclerView1); context=view.getContext(); list=new ArrayList<>(); list=getRawSongList(); adapter =new Myadapter(context,list); recycleview.setAdapter(adapter); LinearLayoutManager manager=new LinearLayoutManager(context); manager.setOrientation(RecyclerView.VERTICAL); recycleview.setLayoutManager(manager); return view; } public List getRawSongList() {//获取歌曲列表的名字 List list = new ArrayList<>(); Field[] fields = R.raw.class.getFields(); for (Field field : fields) { String songName = field.getName(); list.add(songName); } return list; } } ``` ### recycleview.java - 将当前activity和list 作为参数传递给myadapter。 ```java public class RecycleViewActivity extends AppCompatActivity { RecyclerView recycleview; Myadapter adapter; Context context; List list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycle_view); recycleview=findViewById(R.id.RecyclerView1); context=this; adapter =new Myadapter(this,list); recycleview.setAdapter(adapter); LinearLayoutManager manager=new LinearLayoutManager(this); manager.setOrientation(RecyclerView.VERTICAL); recycleview.setLayoutManager(manager); } } ``` ### myadapter.java - 使用holder.getAdapterPosition获取当前绑定的 ViewHolder 在适配器中的位置,这个跟歌名序号是对应关系,可以直接作为当前item对应的歌名序号进行调用 - 使用intent.putExtra将参数传给musicactivity - startActivity启动musicactivity ```java public class Myadapter extends RecyclerView.Adapter{ Context context1; List list1; public Myadapter(Context context,List list){ context1=context; list1=list; } @NonNull @Override public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view= LayoutInflater.from(context1).inflate(R.layout.item,parent,false); Myholder holder=new Myholder(view); return holder; } @Override public void onBindViewHolder(@NonNull Myholder holder, int position) { holder.textview.setText(list1.get(position)); //holder.textview.setText(Integer.toString(holder.getAdapterPosition())); //监听器 holder.textview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Bundle args = new Bundle(); //args.putInt("index", holder.getAdapterPosition()); Log.d("test","onClick"); //holder.getAdapterPosition()获取当前item的序号,跟歌名序号对应,作为参数调用musicactivity Intent intent=new Intent(context1,MusicActivity.class); intent.putExtra("index",holder.getAdapterPosition()); context1.startActivity(intent); Log.d("test","start suc"); } }); } @Override public int getItemCount() { return list1.size(); } public class Myholder extends RecyclerView.ViewHolder { TextView textview; public Myholder(@NonNull View itemView) { super(itemView); textview=itemView.findViewById(R.id.textView8); } } } ``` ## layout1.xml ```xml