当前位置: 首页 > news >正文

android 实现答题功能

一、效果

二、实现思路

1、界面实现

        实现起来其实不难,首先我们可以看到,界面是由答题进度、题目、选项ABCD组成,现在就是要考虑实现方式,答题进度可以使用Textview+progressbar实现,题目直接使用Textview,选项ABCD使用listview或者recyview,这里选择后者recyview。

2、题目切换逻辑实现

    ABCD单选多选可以用使用对象标记不同状态,题目替换可以使用Handler切换到集合下一个数据, ABCD选项列表也是重新赋值。

三、代码

1、题目布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data></data><LinearLayoutandroid:layout_width="@dimen/dp_640"android:layout_height="@dimen/dp_400"android:background="@color/pageBgColor"android:orientation="vertical"><!--  返回模块 --><includeandroid:id="@+id/titleLyout"layout="@layout/chart_top_title_layout" /><!-- 内容 --><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="@dimen/dp_300"android:paddingTop="@dimen/dp_15"><TextViewandroid:id="@+id/questionTitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="@dimen/dp_30"android:layout_marginRight="@dimen/dp_30"android:gravity="center|left"android:text=""android:textColor="@color/white"android:textSize="@dimen/sp_20"android:textStyle="bold" /><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/ryList"android:layout_width="@dimen/dp_385"android:layout_height="wrap_content"android:layout_below="@id/questionTitle"android:layout_marginLeft="@dimen/dp_30"android:layout_marginTop="@dimen/dp_10" /><!-- 再听一遍 --><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginLeft="@dimen/dp_60"android:layout_marginRight="@dimen/dp_30"android:gravity="center"android:orientation="vertical"><LinearLayoutandroid:id="@+id/repeat_tts"android:layout_width="@dimen/dp_60"android:layout_height="@dimen/dp_60"android:background="@drawable/voice_bd_th"android:gravity="center"><ImageViewandroid:layout_width="@dimen/dp_30"android:layout_height="@dimen/dp_25"android:src="@drawable/voice_pic" /></LinearLayout><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="@dimen/dp_5"android:text="再听一遍"android:textColor="@color/white"android:textSize="@dimen/sp_14" /></LinearLayout><TextViewandroid:id="@+id/tvBack"android:layout_width="@dimen/dp_100"android:layout_height="@dimen/dp_30"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="@dimen/dp_240"android:layout_marginBottom="@dimen/dp_15"android:background="@drawable/start_screening_next_qs"android:gravity="center"android:visibility="gone"android:text="上一题"android:textColor="@color/white"android:textSize="@dimen/sp_14" /><TextViewandroid:id="@+id/tvNext"android:layout_width="@dimen/dp_100"android:layout_height="@dimen/dp_30"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="@dimen/dp_120"android:layout_marginBottom="@dimen/dp_15"android:background="@drawable/start_screening_next_qs"android:gravity="center"android:text="下一题"android:textColor="@color/white"android:textSize="@dimen/sp_14" /></RelativeLayout><!-- 底部进度布局 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/dp_60"android:orientation="vertical"><TextViewandroid:id="@+id/tvCount"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="@dimen/dp_20"android:layout_marginTop="@dimen/dp_5"android:text="0/12"android:textColor="@color/white"android:textSize="@dimen/sp_14" /><ProgressBarandroid:id="@+id/progress"style="@style/screeningSeekBar"android:layout_width="match_parent"android:layout_height="@dimen/dp_5"android:layout_marginLeft="@dimen/dp_10"android:layout_marginTop="@dimen/dp_10"android:layout_marginRight="@dimen/dp_5"android:max="50"android:progress="10" /></LinearLayout></LinearLayout>
</layout>

2、abcd答案列表布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data></data><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="@dimen/dp_10"><!-- screnning_question_item --><TextViewandroid:id="@+id/tvContent"android:layout_width="@dimen/dp_160"android:layout_height="@dimen/dp_40"android:background="@drawable/unselect_screnning_qs_item"android:gravity="center"android:text="-"android:textSize="@dimen/sp_14" /></RelativeLayout>
</layout>

3、主界面java代码

package csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screeningcn;import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager;import com.google.gson.Gson;import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;import java.util.ArrayList;
import java.util.List;
import java.util.OptionalInt;
import java.util.stream.IntStream;import csu.xiaoya.robotApp.R;
import csu.xiaoya.robotApp.XiaoYaApp;
import csu.xiaoya.robotApp.base.BaseActivity;
import csu.xiaoya.robotApp.databinding.ScreeningContentLayoutBinding;
import csu.xiaoya.robotApp.glob.GlobalConstant;
import csu.xiaoya.robotApp.ui.activity.homepage.familydIm.FamilyDoctorActivity;
import csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.HealthyScreeningActivity;
import csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screenbean.ReplySuccessBean;
import csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screenbean.ScreeningContentBean;
import csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screenbean.SubmitSreeningBean;
import csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screening_finish.ScreeningFinishPage;
import csu.xiaoya.robotApp.ui.pagemanage.beans.JumpBean;
import csu.xiaoya.robotApp.ui.pagemanage.constant.JumpPageCode;
import csu.xiaoya.robotApp.util.ActivityUtil;
import csu.xiaoya.robotApp.util.GlideUtil;
import csu.xiaoya.robotApp.util.HandlerUtils;
import csu.xiaoya.robotApp.util.dialog.LoginDialogUtil;
import csu.xiaoya.robotApp.util.log.Logger;/*** 健康* 筛查内容*/public class ScreeningContentPage extends BaseActivity<ScreeningContentLayoutBinding, ScreeningContentViewmodle> implements HandlerUtils.OnReceiveMessageListener {// handlerprivate HandlerUtils.HandlerHolder myHandler;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityUtil.getInstance().addActivity(ScreeningContentPage.this);}private int selectModuleId = 0;private int poolCodeType = 0;@Overrideprotected void handleIntent(Intent intent) {super.handleIntent(intent);selectModuleId = Integer.parseInt(intent.getSerializableExtra("selectModuleId").toString());poolCodeType = Integer.parseInt(intent.getSerializableExtra("poolCodeType").toString());Logger.d("======健康筛查内容=====" + selectModuleId);}@Overrideprotected int getLayoutResId() {return R.layout.screening_content_layout;}@Overrideprotected void initViewModel() {}@Overridepublic void handlerMessage(Message msg) {// 刷新列表Logger.d("======没有更多消息======" + questionPosition);}@Overrideprotected void bindViewModel() {mViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(ScreeningContentViewmodle.class);}@Overrideprotected void init() {// 标记为健康筛查答题模式GlobalConstant.asrModule = 1;myHandler = new HandlerUtils.HandlerHolder(this);initTitleLayout();mViewModel.getQuestionList(selectModuleId + "");// 初始化适配器initAdapter();initDataListner();}/*** 答案选择* 适配器*/private ScreeningQuestionAdapater sqAdapter;private ScreeningContentBean sqAdapterBean;private void initAdapter() {sqAdapter = new ScreeningQuestionAdapater();mDataBinding.ryList.setAdapter(sqAdapter);mDataBinding.ryList.setLayoutManager(new GridLayoutManager(this, 2));}/*** 数据* 监听*/private int questionPosition = 0;private void initDataListner() {// 切换下一题mDataBinding.tvNext.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {boolean isCheck = false;//答案是否选择if (questionPosition <= sqAdapterBean.getData().getQuestionList().size()) {if (questionPosition == 0) {questionPosition = 0;}for (int i = 0; i < sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().size(); i++) {if (sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(i).getStatus().equals("1")) {isCheck = true;break;}}if (sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionType().equals("2")) {isCheck = true;}// 已选种答案可以切换下一题if (isCheck) {// 选择效果切换nextQuestion();} else {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(ScreeningContentPage.this, "至少选择一个答案", Toast.LENGTH_SHORT).show();}});}}}});// 问答数据集合mViewModel.getScreeningContentBeanLivewDt().observe(this, new Observer<ScreeningContentBean>() {@Overridepublic void onChanged(ScreeningContentBean screeningContentBean) {questionPosition = 0;sqAdapterBean = screeningContentBean;sqAdapter.adapaterAddData(screeningContentBean.getData().getQuestionList().get(0).getAnswerList());//if (XiaoYaApp.isAIUiFail()) {Toast.makeText(ScreeningContentPage.this, "语音未授权", Toast.LENGTH_SHORT).show();} else {if (sqAdapterBean.getData().getQuestionList().get(0).getQuestionType().equals("2")) {XiaoYaApp.setOnlyPlayTTs(true);}// 语音播报if (XiaoYaApp.getAiuiRecognizerService() != null) {XiaoYaApp.getAiuiRecognizerService().playTts("" + screeningContentBean.getData().getQuestionList().get(0).getQuestionText());}}// 数据显示mDataBinding.questionTitle.setText("" + screeningContentBean.getData().getQuestionList().get(0).getQuestionText());// 计数mDataBinding.tvCount.setText("0/" + screeningContentBean.getData().getQuestionList().size());mDataBinding.progress.setMax(screeningContentBean.getData().getQuestionList().size());mDataBinding.progress.setProgress(0);sqAdapter.notifyDataSetChanged();
//                Logger.LogD("健康筛查内容", "==获取题库==" + new Gson().toJson(screeningContentBean));}});// 答案列表选择监听sqAdapter.setOnItemClickListner(new ScreeningQuestionAdapater.OnItemClickListner() {@Overridepublic void onItemClick(View view, int postion) {answerQt(postion);}@Overridepublic void onItemLongClick(View view, int postion) {}});// 上一个mDataBinding.tvBack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {backQuestion();}});// 重复播放ttsmDataBinding.repeatTts.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (XiaoYaApp.isAIUiFail()) {Toast.makeText(ScreeningContentPage.this, "语音未授权", Toast.LENGTH_SHORT).show();} else {if (sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionType().equals("2")) {XiaoYaApp.setOnlyPlayTTs(true);}// 语音播报if (XiaoYaApp.getAiuiRecognizerService() != null) {XiaoYaApp.getAiuiRecognizerService().playTts("" + sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionText());}}}});// 提交完成mViewModel.getMtReplySuccess().observe(this, new Observer<ReplySuccessBean>() {@Overridepublic void onChanged(ReplySuccessBean replySuccessBean) {if (replySuccessBean != null) {Intent intent = new Intent(ScreeningContentPage.this, ScreeningFinishPage.class);startActivity(intent);finish();LoginDialogUtil.getInstance().closeLoadingDialog();} else {LoginDialogUtil.getInstance().closeLoadingDialog();Toast.makeText(ScreeningContentPage.this, "提交失败", Toast.LENGTH_SHORT).show();}}});}/*** 回答问题*/private void answerQt(int postion) {if (questionPosition <= sqAdapterBean.getData().getQuestionList().size()) {if (questionPosition >= 0) {mDataBinding.tvBack.setVisibility(View.VISIBLE);} else {mDataBinding.tvBack.setVisibility(View.GONE);}// 选择效果切换if (Integer.parseInt(sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionType()) == 1) {//多选);if (sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(postion).getStatus().equals("0")) {sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(postion).setStatus("1");} else {sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(postion).setStatus("0");}runOnUiThread(new Runnable() {@Overridepublic void run() {sqAdapter.notifyDataSetChanged();}});} else {// 单选移除已选for (int i = 0; i < sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().size(); i++) {sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(i).setStatus("0");}// 重新选择if (sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(postion).getStatus().equals("0")) {sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(postion).setStatus("1");} else {sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(postion).setStatus("0");}runOnUiThread(new Runnable() {@Overridepublic void run() {sqAdapter.notifyDataSetChanged();}});nextQuestion();}}}/*** 临时缓存*/private SubmitSreeningBean submitSreeningBean = new SubmitSreeningBean();// 问题集合private List<SubmitSreeningBean.QuestionList> questionList = new ArrayList<>();private void saveScreeningDataList(ScreeningContentBean sqAdBean) {questionList.clear();submitSreeningBean.setPoolCode(poolCodeType);for (int x = 0; x < sqAdBean.getData().getQuestionList().size(); x++) {// 问题对象赋值SubmitSreeningBean.QuestionList qsBean = new SubmitSreeningBean.QuestionList();qsBean.setCreateBy(sqAdBean.getData().getQuestionList().get(x).getCreateBy());qsBean.setUpdateBy(sqAdBean.getData().getQuestionList().get(x).getUpdateBy());qsBean.setUpdateTime(sqAdBean.getData().getQuestionList().get(x).getUpdateTime());qsBean.setQuestionId(sqAdBean.getData().getQuestionList().get(x).getQuestionId());qsBean.setGroupId(sqAdBean.getData().getQuestionList().get(x).getGroupId());qsBean.setQuestionType(sqAdBean.getData().getQuestionList().get(x).getQuestionType());qsBean.setQuestionStemType(sqAdBean.getData().getQuestionList().get(x).getQuestionStemType());qsBean.setQuestionText(sqAdBean.getData().getQuestionList().get(x).getQuestionText());qsBean.setSort(sqAdBean.getData().getQuestionList().get(x).getSort());qsBean.setStatus(sqAdBean.getData().getQuestionList().get(x).getStatus());qsBean.setDelFlag(sqAdBean.getData().getQuestionList().get(x).getDelFlag());// c存答案List<SubmitSreeningBean.QuestionList.AnswerListDTO> answerListDTO = new ArrayList<>();for (int y = 0; y < sqAdBean.getData().getQuestionList().get(x).getAnswerList().size(); y++) {if (sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getStatus().equals("1")) {// 答案对象赋值SubmitSreeningBean.QuestionList.AnswerListDTO aswerBean = new SubmitSreeningBean.QuestionList.AnswerListDTO();aswerBean.setCreateTime(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getCreateTime());aswerBean.setUpdateTime(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getUpdateTime());aswerBean.setAnswerId(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getAnswerId());aswerBean.setQuestionId(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getQuestionId());aswerBean.setAnswerType(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getAnswerType());aswerBean.setAnswerText(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getAnswerText());aswerBean.setAnswerScore(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getAnswerScore());aswerBean.setSort(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getSort());aswerBean.setStatus(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getStatus());aswerBean.setDelFlag(sqAdBean.getData().getQuestionList().get(x).getAnswerList().get(y).getDelFlag());answerListDTO.add(aswerBean);}}// 有时题目为提示类型,是则不提交if (answerListDTO.size() > 0) {qsBean.setAnswerList(answerListDTO);// 单个问题数据保存questionList.add(qsBean);}}submitSreeningBean.setQuestionList(questionList);// 提交给服务端mViewModel.submitQuestionList(submitSreeningBean);//        Logger.LogD("questionList", "======健康筛查00=====" + new Gson().toJson(submitSreeningBean));}/*** 上一题*/private void backQuestion() {if (questionPosition > 0) {if (questionPosition > 1) {mDataBinding.tvBack.setVisibility(View.VISIBLE);} else {mDataBinding.tvBack.setVisibility(View.GONE);}// 统计显示当前进度runOnUiThread(new Runnable() {@Overridepublic void run() {mDataBinding.tvCount.setText(questionPosition + "/" + sqAdapterBean.getData().getQuestionList().size());mDataBinding.progress.setProgress(questionPosition);sqAdapter.notifyDataSetChanged();}});myHandler.postDelayed(new Runnable() {@Overridepublic void run() {questionPosition = questionPosition - 1;runOnUiThread(new Runnable() {@Overridepublic void run() {mDataBinding.questionTitle.setText("" + sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionText());sqAdapter.adapaterAddData(sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList());sqAdapter.notifyDataSetChanged();}});}}, 200);}}/*** 切换* 下一题*/private void nextQuestion() {// 统计显示当前进度runOnUiThread(new Runnable() {@Overridepublic void run() {mDataBinding.tvCount.setText(questionPosition + 1 + "/" + sqAdapterBean.getData().getQuestionList().size());mDataBinding.progress.setProgress(questionPosition + 1);}});if (questionPosition < sqAdapterBean.getData().getQuestionList().size() - 1) {//切换题目myHandler.postDelayed(new Runnable() {@Overridepublic void run() {if (questionPosition + 1 >= sqAdapterBean.getData().getQuestionList().size()) {return;}runOnUiThread(new Runnable() {@Overridepublic void run() {mDataBinding.questionTitle.setText("" + sqAdapterBean.getData().getQuestionList().get(questionPosition + 1).getQuestionText());sqAdapter.adapaterAddData(sqAdapterBean.getData().getQuestionList().get(questionPosition + 1).getAnswerList());sqAdapter.notifyDataSetChanged();}});questionPosition = questionPosition + 1;voiceTTs();}}, 300);} else {LoginDialogUtil.getInstance().showLoadingDialog(this);saveScreeningDataList(sqAdapterBean);}}/*** 问答题目* 语音播报*/private void voiceTTs() {myHandler.postDelayed(new Runnable() {@Overridepublic void run() {// 语音播报if (XiaoYaApp.isAIUiFail()) {Toast.makeText(ScreeningContentPage.this, "语音未授权", Toast.LENGTH_SHORT).show();} else {if (sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionType().equals("2")) {XiaoYaApp.setOnlyPlayTTs(true);}// 语音播报if (XiaoYaApp.getAiuiRecognizerService() != null) {XiaoYaApp.getAiuiRecognizerService().playTts("" + sqAdapterBean.getData().getQuestionList().get(questionPosition).getQuestionText());}}}}, 800);}@Subscribe(threadMode = ThreadMode.MAIN)public void asrQuestioneAnswer(JumpBean jump) {for (int i = 0; i < sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().size(); i++) {if (jump.getConn().contains(sqAdapterBean.getData().getQuestionList().get(questionPosition).getAnswerList().get(i).getAnswerText())) {Logger.d("==========" + jump.getConn() + "==" + questionPosition);answerQt(i);}}}@Overrideprotected void onResume() {super.onResume();EventBus.getDefault().register(this);}@Overrideprotected void onStop() {super.onStop();EventBus.getDefault().unregister(this);}@Overrideprotected void onDestroy() {super.onDestroy();// 标记为页面跳转模式GlobalConstant.asrModule = 0;}/*** 初始化* 健康* 标题布局*/private void initTitleLayout() {mDataBinding.titleLyout.tvTitle.setText("返回");mDataBinding.titleLyout.familyHead.setVisibility(View.GONE);mDataBinding.titleLyout.backArrow.setVisibility(View.VISIBLE);mDataBinding.titleLyout.bluth.setVisibility(View.INVISIBLE);GlideUtil.loadImageWithImage(mDataBinding.titleLyout.backArrow, R.drawable.back_arrow);//返回上一步mDataBinding.titleLyout.backArrowMd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {finish();}});}}

4、abcd是列表

package csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screeningcn;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import androidx.recyclerview.widget.RecyclerView;import java.util.ArrayList;
import java.util.List;import csu.xiaoya.robotApp.R;
import csu.xiaoya.robotApp.ui.fragment_healthy_housekeeper.healthy_screen.screenbean.ScreeningContentBean;/*** 健康筛查a b c d选择* 选项适配器*/public class ScreeningQuestionAdapater extends RecyclerView.Adapter<ScreeningQuestionAdapater.ViewHodler> {private List<ScreeningContentBean.DataDTO.QuestionListDTO.AnswerListDTO> dataList;public ScreeningQuestionAdapater() {dataList = new ArrayList<>();}/*** 点击就监听*/public interface OnItemClickListner {void onItemClick(View view, int postion);void onItemLongClick(View view, int postion);}private OnItemClickListner onItemClickListner;/*** 点击监听*/public void setOnItemClickListner(OnItemClickListner listner) {this.onItemClickListner = listner;}public void adapaterAddData(List<ScreeningContentBean.DataDTO.QuestionListDTO.AnswerListDTO> dataList) {this.dataList.clear();this.dataList.addAll(dataList);}@Overridepublic ViewHodler onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.question_item_layout, parent, false);ViewHodler hodler = new ViewHodler(view);return hodler;}@Overridepublic void onBindViewHolder(final ViewHodler holder, final int position) {if (dataList.get(position).getStatus().equals("0")) {holder.textView.setBackgroundResource(R.drawable.unselect_screnning_qs_item);} else {holder.textView.setBackgroundResource(R.drawable.select_screnning_qs_item);}holder.textView.setText(dataList.get(position).getAnswerText());//设置点击响应if (onItemClickListner != null) {//点击holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//获取当前屏幕上的位置,避免插入后position不对int layoutPosition = holder.getLayoutPosition();onItemClickListner.onItemClick(holder.itemView, layoutPosition);}});//长按holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {int layoutPosition = holder.getLayoutPosition();onItemClickListner.onItemLongClick(holder.itemView, layoutPosition);return false;}});}}@Overridepublic int getItemCount() {return dataList != null ? dataList.size() : 0;}/*** 插入数据*/public void addData(int pos) {
//        dataList.add(pos);dataList.add("Insert One");
//        notifyItemInserted(pos);}/*** 移除数据*/public void deleData(int pos) {dataList.remove(pos);notifyItemRemoved(pos);}/*** viewHolder*/public static class ViewHodler extends RecyclerView.ViewHolder {TextView textView;public ViewHodler(View itemView) {super(itemView);textView = (TextView) itemView.findViewById(R.id.tvContent);}}}

5、handler工具

package csu.xiaoya.robotApp.util;import android.os.Handler;
import android.os.Message;import java.lang.ref.WeakReference;import csu.xiaoya.robotApp.util.log.Logger;public class HandlerUtils {private HandlerUtils() {throw new UnsupportedOperationException("u can't instantiate me...");}public static class HandlerHolder extends Handler {WeakReference<OnReceiveMessageListener> mListenerWeakReference;/*** 使用必读:推荐在Activity或者Activity内部持有类中实现该接口,不要使用匿名类,可能会被GC** @param listener 收到消息回调接口*/public HandlerHolder(OnReceiveMessageListener listener) {mListenerWeakReference = new WeakReference<>(listener);}@Overridepublic void handleMessage(Message msg) {Logger.d("==没有更多消息=="+(mListenerWeakReference != null)+"===="+(mListenerWeakReference.get() != null));if (mListenerWeakReference != null && mListenerWeakReference.get() != null) {mListenerWeakReference.get().handlerMessage(msg);}}}/*** 收到消息回调接口*/public interface OnReceiveMessageListener {void handlerMessage(Message msg);}}

相关文章:

android 实现答题功能

一、效果 二、实现思路 1、界面实现 实现起来其实不难&#xff0c;首先我们可以看到&#xff0c;界面是由答题进度、题目、选项ABCD组成&#xff0c;现在就是要考虑实现方式&#xff0c;答题进度可以使用Textviewprogressbar实现&#xff0c;题目直接使用Textview&#xff0c;…...

JSONP处理跨域请求

JSONP 背景 由于浏览器存在安全策略&#xff0c;所以当访问的请求中的协议、域名、端口其中一个与本站不同时就会形成跨域&#xff0c;这里介绍一种比较简单的方案——jsonp。 原理 浏览器对 script、img这些带有src属性的的标签在发送请求时是不会触发跨域的校验&#xff…...

栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号&#xff0c;由内而外&#xff0c;转向用栈解决。使用两个栈处理&#xff0c;一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…...

华为手机启用ADB无线调试功能

打开开发者模式,勾选USB调试,和“仅充电”模式下允许ADB调试 确认 设置添加adb路径到PATH变量 使用adb查看安卓设置 切换为无线模式: 查看手机IP...

HTML 元素类型介绍

目录 1. 块级元素&#xff08;Block-level Elements&#xff09; 2. 行级元素&#xff08;Inline Elements&#xff09; 3. 行内块级元素&#xff08;Inline-block Elements&#xff09; 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …...

前端反向代理的配置和實現

反向代理是位於客戶端和服務器之間的一個中間層&#xff0c;它代表客戶端向伺服器發起請求&#xff0c;然後將伺服器的回應返回給客戶端。與傳統的正向代理不同&#xff0c;反向代理是由伺服器端配置的&#xff0c;客戶端通常不知道它的存在。在前端開發中&#xff0c;反向代理…...

日志分析工具

一、nginx_log_analysis工具 1、工具下载&#xff0c;http://linux5588.blog.51cto.com/&#xff0c;它是用python语言写的&#xff0c;只是用来分析nginx日志&#xff0c;它的输出比较简单&#xff0c;以IP为主&#xff0c;可以查看每个IP的访问的流量&#xff0c;次数&#…...

python: Serialize and Deserialize complex JSON using jsonpickle

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # Serialize and Deserialize complex JSON in Python # 描述&#xff1a;pip install jsonpickle https://github.com/jsonpi…...

【分布式锁解决超卖问题】setnx实现

目录 使用场景的描述 并发安全问题 悲观锁与乐观锁问题 一人一单的问题 服务器负载均衡问题 分布式锁 分布式锁的实现 获取锁 释放锁 实现思路 误删情况的分析 解决误删的方法 代码优化 分布式锁的原子性分析 文章代码地址&#xff1a;分布式锁1.0 使用场景的描述 今天的主人…...

【MySQL实战45讲笔记】基础篇——事务隔离

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 目录 系列文章1. 事务隔离1.1 隔离性与隔离级别1.2 如何实现事务隔离1.3 事务的启动方式1.4 思考&#xff1a; 使用什么方案来避免长事务 1. 事务隔离 简单来说&#xff0c;事务就是要保证一组数据库操作&…...

RFdiffusion calculate_igso3函数解读

calculate_igso3 函数旨在对 IGSO(3) 分布的概率密度函数 (PDF)、累积分布函数 (CDF)、以及相关统计量进行数值近似计算,特别用于预计算以加速后续操作(例如采样、反向扩散等)。 calculate_igso3函数源代码: def calculate_igso3(*, num_sigma, num_omega, min_sigma, ma…...

Vue3 + Vite 项目引入 postcss + tailwindcss

一、PostCSS 1. 简介 PostCSS 是一个强大的 CSS 处理工具&#xff0c;它本身是一个工具库&#xff0c;但其核心功能是通过插件扩展&#xff0c;来对 CSS 进行编译、转换和优化。它适用于现代 CSS 开发&#xff0c;提供更灵活、高效的方式来处理样式表。 2. 主要作用 增强 CS…...

AI Large Language Model

AI 的 Large Language model LLM , 大语言模型&#xff1a; 是AI的模型&#xff0c;专门设计用来处理自然语言相关任务。它们通过深度学习和庞大的训练数据集&#xff0c;在理解和生成自然语言文本方面表现出色。常见的 LLM 包括 OpenAI 的 GPT 系列、Google 的 PaLM 和 Meta…...

Linux系统性能优化技巧

系统性能优化 在当今的信息技术领域&#xff0c;Linux系统的性能优化变得越来越重要。随着Linux操作系统的广泛应用&#xff0c;从桌面环境到大型服务器集群&#xff0c;性能优化不仅可以提升系统的响应速度和吞吐量&#xff0c;还能降低资源消耗&#xff0c;从而延长硬件使用…...

基于CNN+RNNs(LSTM, GRU)的红点位置检测(pytorch)

1 项目背景 需要在图片精确识别三跟红线所在的位置&#xff0c;并输出这三个像素的位置。 其中&#xff0c;每跟红线占据不止一个像素&#xff0c;并且像素颜色也并不是饱和度和亮度极高的红黑配色&#xff0c;每个红线放大后可能是这样的。 而我们的目标是精确输出每个红点的…...

【AI系统】GPU 架构回顾(从2018年-2024年)

Turing 架构 2018 年 Turing 图灵架构发布&#xff0c;采用 TSMC 12 nm 工艺&#xff0c;总共 18.6 亿个晶体管。在 PC 游戏、专业图形应用程序和深度学习推理方面&#xff0c;效率和性能都取得了重大进步。相比上一代 Volta 架构主要更新了 Tensor Core&#xff08;专门为执行…...

Vue 内置组件 keep-alive 中 LRU 缓存淘汰策略和实现

LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;是通过记录缓存项的访问顺序来决定淘汰的策略&#xff1a;当缓存满时&#xff0c;移除最久未被使用的项。 核心概念&#xff1a; 缓存存储&#xff1a;使用 Map 存储键值对&#xff0c;用于快速访问缓…...

联邦学习安全聚合算法综述(论文解析)以及如何确定自己研究方向的方法

自己写相关论文的方法&#xff1a; 可以重点看看综述类论文的未来研究方向和引言中前人已经做过的内容 联邦学习安全聚合算法综述 auth:江萍 1 通讯作者 李芯蕊 1 赵晓阳 2 杭永凯 摘要 摘要&#xff1a;随着深度学习技术的发展&#xff0c;人工智能在社会的各个方面有着重要…...

【JAVA 笔记】12 带有数据库文件的完整的JDBC访问例子,命令行界面

【JAVA 笔记】12 带有数据库文件的完整的JDBC访问例子&#xff0c;命令行界面 代码结构解析 1. 导入必要的包 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.PreparedStatement; impo…...

基于java+SpringBoot+Vue的在线宠物用品交易网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…...

智慧社区管理系统平台提升物业运营效率与用户体验

内容概要 智慧社区管理系统平台是一个集成了多项功能的综合性解决方案&#xff0c;旨在通过先进的技术手段提升物业管理的效率和居民的生活质量。该平台不仅关注物业运营的各个方面&#xff0c;还强调用户体验的重要性。随着科技的发展&#xff0c;社区管理方式正发生着翻天覆…...

el-table-column自动生成序号在序号前插入图标

实现效果&#xff1a; 代码如下&#xff1a; 在el-table里加入这个就可以了&#xff0c;需要拿到值可以用scope.$index ​​​​​​​<el-table-column type"index" label"序号" show-overflow-tooltip"true" min-width"40">…...

深度学习之目标检测的常用标注工具

1 LabelImg ​ LabelImg 是一款开源的图像标注工具&#xff0c;标签可用于分类和目标检测&#xff0c;它是用 Python 编写的&#xff0c;并使用Qt作为其图形界面&#xff0c;简单好用。注释以 PASCAL VOC 格式保存为 XML 文件&#xff0c;这是 ImageNet 使用的格式。 此外&…...

「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成

本篇将系统介绍Cangjie编程语言中程序的基本组成部分&#xff0c;涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则&#xff0c;帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…...

【计算机网络】解决bind error

服务器有时可以立即重启&#xff0c;有时候无法立即重启 — bind error 首先要知道&#xff1a;四次挥手动作完成之后&#xff0c;主动断开连接的一方要维持一段时间的TIME_WAIT bind error原因&#xff1a;因为是服务器主动断开的&#xff0c;所以服务器要去维持TIME_WAIT状…...

【SVN和GIT】版本控制系统详细下载使用教程

文章目录 ** 参考文章一、什么是SVN和GIT二、软件使用介绍1 SVN安装1.1 服务端SVN下载地址1.2 客户端SVN下载地址2 SVN使用2.1 服务端SVN基础使用2.1.1 创建存储库和用户成员2.1.2 为存储库添加访问人员2.2 客户端SVN基础使用2.2.1 在本地下载库中的内容2.2.2 版本文件操作--更…...

初识 Pynecone:构建现代化 Web 应用的 Python 框架

初识 Pynecone&#xff1a;构建现代化 Web 应用的 Python 框架 引言 在 Web 开发的世界里&#xff0c;Python 是后端开发的常客&#xff0c;但如果想用 Python 直接构建现代化的前端应用会怎样&#xff1f;这正是 Pynecone 框架的用武之地&#xff01;Pynecone 是一个全栈 Pyt…...

Go-RPC关键指标分析与企业实践

1.稳定性-保障策略 熔断&#xff1a;保护调用方 限流&#xff1a;保护被调用方 超时控制&#xff1a;避免浪费 2.稳定性-请求成功率&#xff08;用重复发送 负载均衡&#xff09; 3.稳定性-长尾请求&#xff08;用备份请求&#xff09; 4.稳定性-注册中间件 易用性&#xff1a…...

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…...

Ubuntu下安装Qt

1.如图1所示&#xff0c;在Index of /archive上下载安装包&#xff1b; 图1 2.将图1安装包下载好之后&#xff0c;通过共享文件夹的方式拷贝到ubutntu&#xff0c;如图2所示&#xff1b; 图2 3.如图3所示&#xff0c;执行chmod x qt-creator-opensource-linux-x86_64-10.0.2.…...

《FreeRTOS任务删除篇》

任务删除函数 源码1. 进入临界区1.1 第一步1.2 第二步1.3 第三步1.4 第四步 2. 获取待删除任务的任务控制块TCB3. 从就绪/延迟列表中删除任务4. 从事件列表中删除任务5. 如果待删除任务是当前运行的任务6. 如果待删除任务是其它任务7. 退出临界区7.1 第一步7.2 第二步7.3 第三步…...

取电快充协议芯片,支持全协议、内部集成LDO支持从UART串口读取电压电流消息

H004D 是一款支持全协议的受电端诱骗取电协议芯片&#xff0c;支持宽电压输入 3.3V~30V&#xff0c;芯片内部集成LDO&#xff0c;可输出 3.3V电压, 支持 通过UART 串口读取电压电流&#xff0c;支持定制功能&#xff0c;芯片采用QFN_20封装&#xff0c;线路简单&#xff0c;芯片…...

Linux:自定义Shell

本文旨在通过自己完成一个简单的Shell来帮助理解命令行Shell这个程序。 目录 一、输出“提示” 二、获取输入 三、切割字符串 四、执行指令 1.子进程替换 2.内建指令 一、输出“提示” 这个项目基于虚拟机Ubuntu22.04.5实现。 打开终端界面如图所示。 其中。 之前&#x…...

git 基础之 merge 和 rebase 的比较

在团队软件开发过程中&#xff0c;代码合并是一个基本且频繁执行的任务。 Git 提供了多种合并代码的策略&#xff0c;其中最常用的是 merge 和 rebase。 尽管二者的终极目标是相同的——整合代码变更——它们的方法和推荐的使用场景却有所区别。本文将详细介绍和比较这两种策…...

pve 磁盘选错位置修改

选中磁盘选择磁盘操作&#xff0c;移动存储 改到你要迁移的位置&#xff0c;迁移后原来的文件如果没选择删除源不会删除&#xff0c;需要确认数据没问题后选择相应的文件&#xff0c;如果有快照&#xff0c;快照可能也需要提前删除&#xff0c;删除前请做好备份。...

C语言第十二周课——有趣的小程序

目录 1.我是猪关机程序 1.1dos命令&#xff08;强制关机&#xff09; 1.2思路 1.3源码 2.猜数字 2.1介绍 2.2思路 2.3源码 1.我是猪关机程序 效果:运行程序后电脑在60s后关机&#xff0c;如果输入“我是猪”则取消关机&#xff1b;如果输入“你是猪”则立即关机&…...

【Linux学习】【Ubuntu入门】1-7 ubuntu下磁盘管理

1.准备一个U盘或者SD卡&#xff08;插上读卡器&#xff09;&#xff0c;将U盘插入主机电脑&#xff0c;右键点击属性&#xff0c;查看U盘的文件系统确保是FAT32格式 2.右键单击ubuntu右下角图标&#xff0c;将U盘与虚拟机连接 参考链接 3. Ubuntu磁盘文件&#xff1a;/dev/s…...

解决Windows + Chrome 使用Blob下载大文件时,部分情况下报错net:ERR_FAILED 200 (OK)的问题

背景&#xff1a; 部分线上用户反馈&#xff0c;下载文件会报错&#xff0c;但重启电脑又好了。测试无法复现。遂远程客户&#xff0c;发现在下载超过一定阈值大小的文件时&#xff0c;会报错。 但直接点击下载链接&#xff0c;可以正常下载 查阅代码&#xff0c;以前的写法是…...

SpringBoot多文件上传

多文件上传是在单文件上传的基础上修改而来&#xff0c;不了解单文件上传可以参考上一篇。以下在将修改部分展示如下&#xff1a; 一、修改upload.html文件&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title&g…...

Jenkins修改LOGO

重启看的LOGO和登录页面左上角的LOGO 进入LOGO存在的目录 [roottest-server01 svgs]# pwd /opt/jenkins_data/war/images/svgs [roottest-server01 svgs]# ll logo.svg -rw-r--r-- 1 jenkins jenkins 29819 Oct 21 10:58 logo.svg #jenkins_data目录是我挂载到了/opt目录&…...

幼儿园管理系统|Java|SSM|Vue| 前后端分离

【重要①】前后端源码万字文档部署文档 【重要②】正版源码有问题包售后 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可以提供远程部署安装&#xff0c;包扩环境 【…...

Unity 实现界面拖拽功能的脚本,通过IDragHandler 实现

using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;namespace Assets.Scripts._1024 {class EVENTdome : MonoBehaviour, IPointerDownHandler, IBeginDragHandler, IDragHandler{//Unity 事件处理的几种方式//1 通过编辑…...

【042A】基于51单片机门禁系统【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统RFID读卡器继电器蜂鸣器LED灯。 1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片&#xff1b; 2、通过RC522读卡器读取IC卡信息&#xff0c;信息匹配继电器吸合门锁打开&#xff1b; 3、可通过上位机对IC卡进行注…...

数据库中的增删改查操作、聚合函数、内置函数、分组查询

数据库中的增删改查操作、聚合函数、内置函数、分组查询 CRUD简介Create 新增语法示例单⾏数据全列插⼊单⾏数据指定列插⼊多⾏数据指定列插⼊ Retrieve 检索语法⽰例构造数据 Select全列查询指定列查询查询字段为表达式为查询结果指定别名语法⽰例 结果去重查询 Order by 排序…...

递归------深度优先搜索

深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。它从一个顶点开始&#xff0c;尽可能深地搜索树的分支。深度优先搜索沿着一条路径深入&#xff0c;直到无法继续为止&#xff0c;然后回溯并尝试其他路径。这种搜…...

三十一、构建完善微服务——API 网关

一、API 网关基础 系统拆分为微服务后&#xff0c;内部的微服务之间是互联互通的&#xff0c;相互之间的访问都是点对点的。如果外部系统想调用系统的某个功能&#xff0c;也采取点对点的方式&#xff0c;则外部系统会非常“头大”。因为在外部系统看来&#xff0c;它不需要也没…...

【大语言模型】ACL2024论文-20 SCIMON:面向新颖性的科学启示机器优化

【大语言模型】ACL2024论文-20 SCIMON&#xff1a;面向新颖性的科学启示机器优化 目录 文章目录 【大语言模型】ACL2024论文-20 SCIMON&#xff1a;面向新颖性的科学启示机器优化目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果推荐阅读指数&#xff1a;★★★★☆ …...

GRU (门控循环单元 - 基于RNN - 简化LSTM又快又好 - 体现注意力的思想) + 代码实现 —— 笔记3.5《动手学深度学习》

目录 0. 前言 1. 门控隐状态 1.1 重置门和更新门 1.2 候选隐状态 1.3 隐状态 2. 从零开始实现 2.1 初始化模型参数 2.2 定义模型 2.3 训练与预测 3 简洁实现 4. 小结 0. 前言 课程全部代码&#xff08;pytorch版&#xff09;已上传到附件看懂上一篇RNN的所有细节&am…...

C++头文件大全(要是还有请帮忙)

以下是 C 中常见的各类头文件分类列举&#xff08;但实际远不止这些&#xff0c;随着标准库扩充及第三方库使用会有更多&#xff09;&#xff1a; 输入 / 输出流相关头文件 <iostream>&#xff1a;用于标准输入输出&#xff0c;定义了 cin、cout 等对象。<fstream>…...

免费好用的静态网页托管平台全面对比介绍

5个免费好用的静态网页托管平台全面对比 前言 作为一名前端开发者&#xff0c;经常会遇到需要部署静态网页的场景。无论是个人项目展示、简单的游戏demo还是作品集网站&#xff0c;选择一个合适的托管平台都很重要。本文将详细介绍5个免费的静态网页托管平台&#xff0c;帮助…...