HomeworkFeedbackActivity.java 8.99 KB
package com.hjx.parent;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.google.android.flexbox.FlexboxLayoutManager;
import com.google.gson.Gson;
import com.hjx.parent.databinding.ActivityHomeworkFeedbackBinding;
import com.hjx.parent.rx.BaseRxActivity;
import com.prws.common.bean.Student;
import com.prws.common.bean.homework.Correction;
import com.prws.common.bean.homework.CorrectionPoint;
import com.prws.common.bean.homework.HomeWork;
import com.prws.common.bean.homework.HomeworkList;
import com.prws.common.bean.homework.KeyValue;
import com.prws.common.net.NetWorks;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class HomeworkFeedbackActivity extends BaseRxActivity<ActivityHomeworkFeedbackBinding> {
    private Student student;
    private HomeworkList mData;
    private ArrayList<HomeWork> mList;
    private List<Correction> corrections = new ArrayList<>();

    @SuppressWarnings("unchecked")
    @Override
    public void initView(Bundle savedInstanceState) {
        binding.toolbar.setNavigationOnClickListener(v -> onBackPressed());
        student = (Student) getIntent().getSerializableExtra("student");
        mData = (HomeworkList) getIntent().getSerializableExtra("data");
        mList = (ArrayList<HomeWork>) getIntent().getSerializableExtra("list");

        binding.tvStuName.setText(student.stuName);
        binding.tvGrade.setText(student.grade);

        List<HomeWork> errorList = new ArrayList<>();
        int correctNo = 0;
        for (HomeWork homeWork: mList) {
            homeWork.state = 1;
            homeWork.index = mList.indexOf(homeWork);
            corrections.add(new Correction(homeWork.brief, homeWork.check ? 1 : 0));
            if (!homeWork.check) correctNo ++;
            else errorList.add(homeWork);
        }
        binding.tvPercent.setText(new DecimalFormat("0%").format(1f * correctNo / mList.size()));

        binding.rvCorrect.setLayoutManager(new FlexboxLayoutManager(this));
        NumberAdapter numberAdapter = new NumberAdapter(mList);
        binding.rvCorrect.setAdapter(numberAdapter);
        binding.rvError.setVisibility(errorList.isEmpty() ? View.GONE : View.VISIBLE);
        binding.rvError.setAdapter(new EvalAdapter(errorList));

        binding.btnDetail.setOnClickListener(v -> {
            viewTopicDetail(0);
        });
        numberAdapter.setOnItemClickListener((baseQuickAdapter, view, i) -> {
            viewTopicDetail(i);
        });
        binding.btnPublish.setOnClickListener(v -> submit());
    }

    private void viewTopicDetail(int position) {
        Intent intent = new Intent(this, HomeworkTopicActivity.class);
        intent.putExtra("list", mList);
        intent.putExtra("position", position);
        startActivity(intent);
    }

    @SuppressLint("CheckResult")
    private void submit() {
        Map<String, Object> body = new HashMap<>();
        body.put("homeworkId", mData.getId());
        body.put("comment", binding.etComment.getText().toString());
        body.put("stuId", student.stuId);
        body.put("points", countPoint());
        body.put("correctionList", corrections);
        NetWorks.service_url.uploadHomeworkFeedback(NetWorks.getHeader(), body)
                .compose(transformSingle())
                .subscribe((response, th) -> {
                    if (th != null) th.printStackTrace();
                    if (response != null && response.getSuccess()) {
                        // TODO
                        Toast.makeText(this, "反馈成功", Toast.LENGTH_SHORT).show();
                        setResult(RESULT_OK);
                        finish();
                    }
                });
    }

    @SuppressLint("CheckResult")
    private List<CorrectionPoint> countPoint() {
        Set<KeyValue> set = new HashSet<>();
        Map<String, Integer> totalTimes = new HashMap<>();
        Map<String, Integer> correctTimes = new HashMap<>();
        Map<String, Integer> underTimes = new HashMap<>();
        Map<String, Integer> baseTimes = new HashMap<>();
        Map<String, Integer> normalTimes = new HashMap<>();
        Gson gson = new Gson();
        for (HomeWork homeWork: mList) {
            homeWork.formatPoints(gson);

            set.addAll(homeWork.pointsObj);
            for (KeyValue keyValue: homeWork.pointsObj) {
                String key = keyValue.Key;
                if (totalTimes.containsKey(key)) {
                    totalTimes.put(key, totalTimes.get(key) + 1);
                } else {
                    totalTimes.put(key, 1);
                }
                if (!homeWork.check) {
                    if (correctTimes.containsKey(key)) {
                        correctTimes.put(key, correctTimes.get(key) + 1);
                    } else {
                        correctTimes.put(key, 1);
                    }
                } else if (homeWork.state == 1) {
                    if (underTimes.containsKey(key)) {
                        underTimes.put(key, underTimes.get(key) + 1);
                    } else {
                        underTimes.put(key, 1);
                    }
                } else if (homeWork.state == 2) {
                    if (baseTimes.containsKey(key)) {
                        baseTimes.put(key, baseTimes.get(key) + 1);
                    } else {
                        baseTimes.put(key, 1);
                    }
                } else if (homeWork.state == 3) {
                    if (normalTimes.containsKey(key)) {
                        normalTimes.put(key, normalTimes.get(key) + 1);
                    } else {
                        normalTimes.put(key, 1);
                    }
                }
            }
        }
        List<CorrectionPoint> points = new ArrayList<>();
        for (KeyValue obj: set) {
            CorrectionPoint point = new CorrectionPoint();
            point.pointId = obj.Key;
            point.pointName = obj.Value;
            point.totalCount = ifNull(totalTimes.get(obj.Key), 1);
            point.correctCount = ifNull(correctTimes.get(obj.Key), 0);
            point.understandCount = ifNull(underTimes.get(obj.Key), 0);
            point.basicCount = ifNull(baseTimes.get(obj.Key), 0);
            point.normalCount = ifNull(normalTimes.get(obj.Key), 0);

            points.add(point);
        }

        return points;
    }

    private int ifNull(Integer src, int defaultVal) {
        if (src == null) return defaultVal;
        else return src;
    }


    @Override
    protected ActivityHomeworkFeedbackBinding getViewBinding() {
        return ActivityHomeworkFeedbackBinding.inflate(getLayoutInflater());
    }

    static class NumberAdapter extends BaseQuickAdapter<HomeWork, BaseViewHolder> {

        public NumberAdapter(List<HomeWork> list) {
            super(R.layout.item_feedback_num, list);
        }

        @Override
        protected void convert(@NonNull BaseViewHolder holder, HomeWork homeWork) {
            int position = getData().indexOf(homeWork);
            holder.setText(R.id.tvNum, String.valueOf(position + 1));
            if (homeWork.check) {
                holder.setImageResource(R.id.ivType, R.drawable.ic_wrong_small);
            } else {
                holder.setImageResource(R.id.ivType, R.drawable.ic_correct_small);
            }
        }
    }

    static class EvalAdapter extends BaseQuickAdapter<HomeWork, BaseViewHolder> {

        public EvalAdapter(@Nullable List<HomeWork> data) {
            super(R.layout.item_homework_eval, data);
        }

        @Override
        protected void convert(@NonNull BaseViewHolder holder, HomeWork homeWork) {
            holder.itemView.setClipToOutline(true);
            holder.setText(R.id.tvNo, "题目" + (homeWork.index + 1));
            ImageView iv = holder.getView(R.id.ivTopic);
            Glide.with(mContext).load(homeWork.url).into(iv);

            RadioButton chk1 = holder.getView(R.id.chk1);
            RadioButton chk2 = holder.getView(R.id.chk2);
            RadioButton chk3 = holder.getView(R.id.chk3);
            chk1.setOnCheckedChangeListener((v, b) -> {
                if (b) {
                    homeWork.state = 1;
                }
            });
            chk2.setOnCheckedChangeListener((v, b) -> {
                if (b) {
                    homeWork.state = 2;
                }
            });
            chk3.setOnCheckedChangeListener((v, b) -> {
                if (b) {
                    homeWork.state = 3;
                }
            });
            chk1.setChecked(homeWork.state == 1);
            chk2.setChecked(homeWork.state == 2);
            chk3.setChecked(homeWork.state == 3);
        }
    }
}