读书程序gitee-----2023/11/11https://gitee.com/zhangqiaoer/read-app.git目录
一、 目标
挑选读书app的任一tab,在实现recycleview的基础上,通过activty调转,显示每个item的详细信息
在actvity里实现service服务的调用
二、 技术准备
- 熟练掌握recycleview控件的使用
- Intent实现activity 之间的跳转以及数据传递
- 造activity中调用service控件
三、 列表(RecycleView)效果实现
3.1 总体设计
- 创建一个包含Recyclerview的xml文件并且对其item进行UI设计
- 改写Adapter类,实现对列表item内容的适配进而显示图书列表
3.2 Recycleview的创建和item项设计
新建一个xml文件加入一个Recyclerview控件,就成功创建了一个列表
新建一个readitem.xml,利用horizontal的和vertical的LinearLayout进行布局和排版,并且调整字体大小,背景文字颜色,达到想要展示的UI效果
代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#6380D8FF">
<LinearLayout
android:layout_width="256dp"
android:layout_height="288dp"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:id="@+id/imagebook"
android:layout_width="match_parent"
android:layout_height="207dp"
android:layout_weight="1"
android:background="#E7F6F6"
app:srcCompat="@drawable/ic_launcher_foreground"
tools:srcCompat="@drawable/pingfandeshijie" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="57dp"
android:layout_weight="1"
android:background="#F8F7F1"
android:orientation="horizontal">
<TextView
android:id="@+id/textb"
android:layout_width="180dp"
android:layout_height="56dp"
android:layout_gravity="top"
android:layout_weight="1"
android:background="#E7F6F6"
android:text="书名"
android:textSize="28sp" />
<TextView
android:id="@+id/textw"
android:layout_width="54dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="#E7F6F6"
android:gravity="top"
android:text="作者"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="161dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#F3F1EC"
android:orientation="vertical">
<TextView
android:id="@+id/textView19"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/texti"
android:layout_width="match_parent"
android:layout_height="257dp"
android:background="#C1EACD"
android:text=" 简介"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
3.3 Adapter类改写
继承Adapter类,编写自己的Readadapter来控制阅读栏对应的Fragment1.java文件,完成各种操作。
编写自己的Myholder类,绑定item中的元素,实现对item中元素的控制。
public class Myholder extends RecyclerView.ViewHolder{
TextView textViewb,textVieww,textView;
ImageView imageView;
LinearLayout item;
public Myholder(View itemview)
{
super(itemview);
textViewb=itemview.findViewById(R.id.textb);//与item里对应的控件绑定
textVieww=itemview.findViewById(R.id.textw);
textView=itemview.findViewById(R.id.texti);
imageView=itemview.findViewById(R.id.imagebook);
item=itemview.findViewById(R.id.item);
}
}
绑定Fragment1文件与其对应的item文件
并且用Fragment1中的RecyclerView中的item项实例化Myholder类对象
public class ReadAdapter extends RecyclerView.Adapter<ReadAdapter.Myholder>{
Context context1;
List<Map<String,Object>> data1;
public ReadAdapter(Context context,List<Map<String,Object>> data) {
super();
context1=context;
data1=data;
}
@NonNull
@Override
public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {//确定每个item的具体视图
View view= LayoutInflater.from(context1).inflate(R.layout.readitem,parent,false);
ReadAdapter.Myholder holder=new ReadAdapter.Myholder(view);//将列表传进来了
return holder;
}
改写onBindViewHolder函数,通过位置指针position得到当前item项所携带的信息。
利用实例化的Myholder对象,设置当前item项中的布局控件的显示内容。
public void onBindViewHolder(@NonNull Myholder holder, @SuppressLint("RecyclerView") int position) { //将值传递给控件
String bname= data1.get(position).get("bname").toString();
String wname= data1.get(position).get("wname").toString();
String sen=data1.get(position).get("sentence").toString();
String det=data1.get(position).get("detalis").toString();
int mimage=Integer.parseInt(data1.get(position).get("image").toString());
holder.textViewb.setText(bname);
holder.textVieww.setText(wname);
holder.imageView.setImageResource(mimage);
holder.textView.setText(det);
3.4 效果展示
四、 Activity跳转效果实现
4.1 总体设计
- 创建一个新的xml文件进行设计跳转详情界面
- 在ReadAdapter类中使用Intent控件参数传递
- 编写控制详情界面的Activity,进行参数接收和控件信息设置
4.2 详情页面设计
新建一个readactivity.xml,利用各种布局控件,并且调整字体大小,背景文字颜色,达到想要展示的效果。考虑后面要利用按钮控件实现听书服务的启停,所以此处布局三个按钮控件
4.3 增加ReadAdapter类功能
在onBindViewHolder函数中新增一个对item布局控件的点击监听,
创建一个Intent对象,实现Activity之间的通信。点击时利用startactivity(intent)函数实现activity之间的跳转
如下代码。Fragment1通过利用ReadAdapter适配器向ReadActivity中传递了item项中没有的详细信息。
holder.item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(context1, Readactivity.class);
intent.putExtra("details",det);
intent.putExtra("sentence",sen);
intent.putExtra("image",mimage);
intent.putExtra("pos",position);
context1.startActivity(intent);
}
});
}
4.4 详情界面控制Activity程序编写
新建一个ReadActivity。绑定对应的详情页面readactivity.xml,绑定需要设置内容的布局控件
创建一个Intent用于接收ReadAdapter传递过来的信息,利用这些信息设置readactivity.xml的布局控件显示的内容
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
Intent intent=getIntent();//接收ReadAdapter传来的信息
textViewdet=findViewById(R.id.textm);
textViewsen=findViewById(R.id.texts);
imageView=findViewById(R.id.imageo);
buttonstart=findViewById(R.id.buttonstart);
buttonend=findViewById(R.id.buttonend);
buttonback=findViewById(R.id.buttonback);
String details=intent.getStringExtra("details");
String sentence=intent.getStringExtra("sentence");
int image=intent.getIntExtra("image",0);
int i=intent.getIntExtra("pos",0);
textViewdet.setText(details);//设置当前布局控件的内容
textViewsen.setText(sentence);
imageView.setImageResource(image);
4.5 效果展示
五、 听书服务的实现
5.1 总体设计
- 创建一个service文件,实现听书服务
- 修改ReadActivity,对布局文件中设定的三个按钮进行监听,从而实现听书服务的启停
5.2 编写service服务程序
创建service文件
编写Listenbookservice程序,程序中创建了一个MediaPlayer对象,在service的函数中控制歌曲的播放和停止,以及对象的释放。
onStartCommand方法会在服务被启动时调用,并接收一个 Intent
对象,其中包含了启动服务的请求信息。intent接收了ReadActivity传递的当前位置信息,从而得知听书列表中哪首播放。
package com.example.read;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
public class ListenbookService extends Service {
MediaPlayer player;//创建媒体控制对象
int music[]={R.raw.pingfandshijie,R.raw.woyuanchanghuanxi,R.raw.shenshan,R.raw.yue,R.raw.weicheng};
//存的音乐列表
int i;
public ListenbookService() {
}
public void onCreate() {
super.onCreate();
//player=MediaPlayer.create(this,R.raw.music1);//Context赋值
//player=MediaPlayer.create(this,music[i]);//歌曲列表
}
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("zy","Myservice1:onStartCommand...");
i=intent.getIntExtra("pos",1);//写在这里完全是为了实现歌曲列表的切换,写在creat里才更有逻辑
player=MediaPlayer.create(this,music[i]);//通过intent传进来的位置信息,得知当前歌曲列表对应的是哪首歌曲
player.start();//放歌
return super.onStartCommand(intent, flags, startId);
}
public void onDestroy() {
player.stop();//停止播放
player.release();//释放播放歌的对象
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
5.3 详情界面控制程序增加功能
在ReadActivity中 创建一个Intent进行当前activity与service之间的对三个按钮进行监听。第一个按钮调用startservice()函数启动服务,第二个按钮调用stopservice()函数停止函数,第三个按钮调用finish()函数结束当前activity返回Fragment1
Intent intent1=new Intent(Readactivity.this, ListenbookService.class);
intent1.putExtra("pos",i);
buttonstart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//保证点第一次的时候播,而不是点一次播一次造成混乱
startService(intent1);//开启
}
});
buttonend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent1);//停止服务
}
});
buttonback.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();//结束当前activity返回上一个activity
}
});
5.4 效果展示
六、总结
- 本次项目我学习到了利用Adapter类实现对java文件的控制
- 利用Intent实现activity之间的跳转,以及进行activity之间的信息传递。通过startactivity()可以启动另一个 Activity,而通过 putExtra()可以在 Intent 中传递额外的数据
- 编写service服务程序是一种在后台执行操作的组件,可以用来执行一些长时间运行的任务,比如播放音乐。利用Mediaplayer类实现对歌曲处理
- Activity中用startservice()、stopservice()控制服务的启停
通过本次的学习,感觉原来我们平时应用的各类软件就是通过这样一个一个服务之间的互相通讯合作来处理请求的。真的很有意思。
仓库地址: