MVVM-Day7

点赞、关注、评论

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更换成刚写的类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值