点赞、关注、评论
APi接口:
//关注
@POST("guanzhu/guanzhu")
Observable<ResultEntity> getFocusData(@Body RequestBody body);
//关注
@POST("guanzhu/noguanzhu")
Observable<ResultEntity> getNofocusData(@Body RequestBody body);
//点赞
@POST("/fav/love")
@FormUrlEncoded
Observable<ResultEntity> getLikeData(@Field("videoid") int id);
@POST("/fav/nolove")
@FormUrlEncoded
Observable<ResultEntity> getNolikeData(@Field("videoid") int id);
//获取评论
@GET("comment/getCommentByVideoId")
Observable<PlEntity> getPlData(@Query("videoId")int id);
//发表评论
@POST("comment/comment")
Observable<PlEntity> getSendPlData(@Body RequestBody body);
Modle接口:
public Observable<ResultEntity> getFocusData(RequestBody body){
return api.getFocusData(body);
}
public Observable<ResultEntity> getnofocusData(RequestBody body){
return api.getNofocusData(body);
}
public Observable<ResultEntity> getLikeData(int id){
return api.getLikeData(id);
}
public Observable<ResultEntity> getNolikeData(int id){
return api.getNolikeData(id);
}
public Observable<PlEntity> getPlData(int id){
return api.getPlData(id);
}
public Observable<PlEntity> getSendPlData(RequestBody body){
return api.getSendPlData(body);
}
ViewModel层:
public MutableLiveData<ResultEntity> liveData1=new MutableLiveData<>(); public MutableLiveData<ResultEntity> liveData2=new MutableLiveData<>(); public MutableLiveData<ResultEntity> liveData3=new MutableLiveData<>(); public MutableLiveData<ResultEntity> liveData4=new MutableLiveData<>(); public MutableLiveData<PlEntity> liveData5=new MutableLiveData<>(); public MutableLiveData<PlEntity> liveData6=new MutableLiveData<>();
public void getFocus(RequestBody body){
bModel.getFocusData(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResultEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResultEntity resultEntity) {
liveData1.postValue(resultEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public void getNofocus(RequestBody body){
bModel.getnofocusData(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResultEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResultEntity resultEntity) {
liveData4.postValue(resultEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public void getlike(int id){
bModel.getLikeData(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResultEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResultEntity resultEntity) {
liveData3.postValue(resultEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public void getnolike(int id){
bModel.getNolikeData(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResultEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResultEntity resultEntity) {
liveData3.postValue(resultEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public void getPl(int id){
bModel.getPlData(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<PlEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(PlEntity plEntity) {
Log.i("TAG", "onNext: "+plEntity.getData().size());
liveData5.postValue(plEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public void getSendPl(RequestBody body){
bModel.getSendPlData(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<PlEntity>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(PlEntity plEntity) {
liveData6.postValue(plEntity);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
Fragment层:
adapter.addChildClickViewIds(R.id.iv_focus,R.id.iv_like,R.id.iv_comment,R.id.iv_collect,R.id.iv_share,R.id.iv_close,R.id.iv_send);
adapter.setOnItemChildClickListener((adapter, view, position) -> {
switch (view.getId()){
//关注
case R.id.iv_focus:
focus(position);
break;
//点赞
case R.id.iv_like:
like(position);
break;
case R.id.iv_comment:
comment(position);
break;
case R.id.iv_close:
close(position);
break;
case R.id.iv_send:
sendcomment(position);
break;
case R.id.iv_collect:
break;
case R.id.iv_share:
break;
}
});
}
private void sendcomment(int position) {
EditText rd_plcontent= (EditText) adapter.getViewByPosition(position,R.id.ed_pl_content);
String msg = rd_plcontent.getText().toString();
int id = adapter.getData().get(position).getId();
if (!TextUtils.isEmpty(msg)) {
Map<String,Object> map=new HashMap<>();
map.put("msg",msg);
map.put("videoId",id);
String json=new Gson().toJson(map);
RequestBody requestBody=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),json);
mViewModel.getSendPl(requestBody);
rd_plcontent.setText("");
}
//置顶功能
PlEntity.DataBean dataBean=new PlEntity.DataBean();
dataBean.setMsg(msg);
dataBean.setIcon(SPUtils.getInstance().getString("icon"));
dataBean.setUsername(SPUtils.getInstance().getString("username"));
plAdapter.getData().add(dataBean);
plAdapter.addData(0,dataBean);
plAdapter.notifyDataSetChanged();
}
private void close(int position) {
//隐藏评论
ConstraintLayout constraintLayout = (ConstraintLayout) adapter.getViewByPosition(position,R.id.pl);
constraintLayout.setVisibility(View.GONE);
//动画
Animation animation=AnimationUtils.loadAnimation(getActivity(),R.anim.out);
animation.setInterpolator(new BounceInterpolator());
constraintLayout.startAnimation(animation);
}
private void comment(int position) {
//点击显示评论
ConstraintLayout constraintLayout= (ConstraintLayout) adapter.getViewByPosition(position,R.id.pl);
constraintLayout.setVisibility(View.VISIBLE);
//动画
Animation animation=AnimationUtils.loadAnimation(getActivity(),R.anim.in);
animation.setInterpolator(new BounceInterpolator());
constraintLayout.startAnimation(animation);
int id = adapter.getData().get(position).getId();
mViewModel.getPl(id);
plAdapter=new MyPlAdapter(R.layout.item_comment);
RecyclerView rv_pl= (RecyclerView) adapter.getViewByPosition(position,R.id.rv_pl);
rv_pl.setLayoutManager(new LinearLayoutManager(getActivity()));
rv_pl.setAdapter(plAdapter);
tv_comment= (TextView) adapter.getViewByPosition(position,R.id.tv_comment);
}
//点赞
private void like(int position) {
VideoEntity.DataBean dataBean = adapter.getData().get(position);
int id = dataBean.getId();
//图片
ImageView iv_like= (ImageView) adapter.getViewByPosition(position,R.id.iv_like);
TextView tv_like= (TextView) adapter.getViewByPosition(position,R.id.tv_like);
if (dataBean.getDianzan()==0){
mViewModel.getlike(id);
iv_like.setImageResource(R.drawable.baseline_favorite_24);
//缩放动画
ObjectAnimator scaleX=ObjectAnimator.ofFloat(iv_like,"scaleX",1,2,1);
ObjectAnimator scaleY=ObjectAnimator.ofFloat(iv_like,"scaleY",1,2,1);
AnimatorSet animatorSet=new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.play(scaleX).with(scaleY);
animatorSet.start();
//文字
int like_count = dataBean.getLike_count();
like_count++;
dataBean.setLike_count(like_count);
tv_like.setText(like_count+"");
dataBean.setDianzan(1);
Toast.makeText(getActivity(), "点赞成功", Toast.LENGTH_SHORT).show();
}else {
mViewModel.getnolike(id);
int like_count = dataBean.getLike_count();
like_count--;
dataBean.setLike_count(like_count);
tv_like.setText(like_count+"");
iv_like.setImageResource(R.drawable.baseline_favorite_border_24);
dataBean.setDianzan(0);
Toast.makeText(getActivity(), "取消点赞成功", Toast.LENGTH_SHORT).show();
}
}
//关注
private void focus(int position) {
VideoEntity.DataBean dataBean = adapter.getData().get(position);
String authname=dataBean.getAuthname();
Map<String,String> map=new HashMap<>();
map.put("authname",authname);
String json=new Gson().toJson(map);
RequestBody requestBody=RequestBody.create(MediaType.parse("application/json;charset=utf-8"),json);
ImageView iv_focus= (ImageView) adapter.getViewByPosition(position,R.id.iv_focus);
if (dataBean.getGuanzhu()==0){
mViewModel.getFocus(requestBody);
//图片
iv_focus.setImageResource(R.drawable.baseline_check_24);
iv_focus.setBackground(getContext().getDrawable(R.drawable.shape_tuijian_quan_jin));
//动画
ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(iv_focus,"alpha",1,0);
objectAnimator.setDuration(2000);
objectAnimator.start();
dataBean.setGuanzhu(1);
}else {
mViewModel.getNofocus(requestBody);
//图片
iv_focus.setImageResource(R.drawable.baseline_add_circle_outline_24);
iv_focus.setBackground(getContext().getDrawable(R.drawable.shape_tuijian_add));
//动画
ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(iv_focus,"alpha",0,1);
objectAnimator.setDuration(2000);
objectAnimator.start();
dataBean.setGuanzhu(0);
}
}
handObserver方法:
mViewModel.liveData1.observe(this, resultEntity -> {
if (resultEntity.getCode()==200){
Toast.makeText(getActivity(), "关注成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getActivity(), "关注失败", Toast.LENGTH_SHORT).show();
}
});
mViewModel.liveData4.observe(this, resultEntity -> {
if (resultEntity.getCode()==200){
Toast.makeText(getActivity(), "取消关注成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getActivity(), "取消关注失败", Toast.LENGTH_SHORT).show();
}
});
mViewModel.liveData2.observe(this, resultEntity -> {
if (resultEntity.getCode()==200){
Toast.makeText(getActivity(), "点赞成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getActivity(), "点赞失败", Toast.LENGTH_SHORT).show(); }
});
mViewModel.liveData3.observe(this, resultEntity -> {
if (resultEntity.getCode()==200){
Toast.makeText(getActivity(), "取消点赞成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getActivity(), "取消点赞失败", Toast.LENGTH_SHORT).show(); }
});
mViewModel.liveData5.observe(this, plEntity -> {
if (plEntity.getCode()==200){
pllist.clear();
plAdapter.getData().clear();
pllist.addAll(plEntity.getData());
plAdapter.getData().addAll(pllist);
tv_comment.setText(plEntity.getData().size()+"条评论");
plAdapter.notifyDataSetChanged();
}
});
mViewModel.liveData6.observe(this, plEntity -> {
if (plEntity.getCode()==200){
Toast.makeText(getActivity(), "发表评论成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getActivity(), "发表评论失败", Toast.LENGTH_SHORT).show();
}
});
所需依赖:
def room_version = "2.5.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'com.shuyu:GSYVideoPlayer:7.1.2' //GSY视频播放
implementation 'com.blankj:utilcodex:1.30.6'
implementation ('com.alibaba:arouter-api:1.5.2') //ARouter依赖 //版本要改成最新版本
annotationProcessor 'com.alibaba:arouter-compiler:1.5.2' //ARouter依赖
implementation 'com.google.code.gson:gson:2.8.0'//gson依赖
//RxJava依赖:主要用于消息传递
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
//Retrofit依赖
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
//Gson converter gson解析
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
//RxJava2 Adapter
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
//okhttp
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
//rxlifecycle异步线程生命周期管理
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
//rxpermissions
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.0'//万能适配器
implementation 'com.android.support:recyclerview-v7:30.0.0'//recyclerview
implementation 'com.android.support:design:30.0.0'
implementation 'com.flyco.tablayout:FlycoTabLayout_Lib:2.0.2@aar'//flycotablayout
事件分发机制(使视频RecyclerView不与评论RecyclerView冲突)创建一个类:
package com.bw.zy3;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.recyclerview.widget.RecyclerView;
public class CusView extends RecyclerView {
private float mLastMotionX;
private float mLastMotionY;
public CusView(Context context) {
super(context);
}
public CusView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CusView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastMotionX = event.getX();
mLastMotionY = event.getY();
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
float deltaX = x - mLastMotionX;
float deltaY = y - mLastMotionY;
if (Math.abs(deltaX) > Math.abs(deltaY)) {
getParent().requestDisallowInterceptTouchEvent(true);
}
mLastMotionX = x;
mLastMotionY = y;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return super.onTouchEvent(event);
}
}
将评论中的RecyclerView更换成刚写的类