jjzjj

android - 检查 Recyclerview Adapter 中的单选按钮状态并从 MainActivity 对其应用更改

coder 2023-12-26 原文

在我的 MainActivity 方法中,checkAnswer 和 showSolution 必须修改,因为我将 RecycleView 适配器添加到项目并将所有 View 项移动到 QuestionAdapter。我不明白我应该如何在 QuestionAdapter 中使用 isChecked 检查 rbGroup 单选按钮的状态并将其 id 传递给 MainActivity。 我试着检查一下:Radiogroup in recyclerview 但我仍然不清楚下一步应该采取什么步骤。 有人可以给我基本的指导,从现在开始修改我的项目应该采取什么步骤。 仍然找不到在回收 View 中处理单选按钮列表的答案或教程。如何使用 MainActivity 的界面检查单选按钮状态?

按照建议进行了一些更新。不明白我应该如何修改 showSolution 方法。

public class MainActivity extends AppCompatActivity {

public QuestionAdapter adapter;
public ArrayList<Question> questionList;
private int questionCountTotal;
private long backPressedTime;
private int score;
private int questionCounter;
private Button btnConfirmNext;
private boolean answered;
private Question currentQuestion;
private TextView tvQuestion, tvScore, tvQuestionCount, tvCountdown;
public QuizDbHelper dbHelper;
RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnConfirmNext = findViewById(R.id.confirm_button);
    tvCountdown = findViewById(R.id.count_down);
    tvScore = findViewById(R.id.text_view_score);

    recyclerView = findViewById(R.id.recycler_view);
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
    questionList = new ArrayList<>();
    adapter = new QuestionAdapter(this, questionList);

    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 1);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);

    dbHelper = new QuizDbHelper(this);
    questionList = dbHelper.getAllQuestions();
    questionCountTotal = questionList.size();
    Collections.shuffle(questionList);

        prepareQuestion();

    btnConfirmNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            checkAnswer();
        }
    });

}


private void prepareQuestion() {
    adapter = new QuestionAdapter(getApplicationContext(), questionList);
    recyclerView.setAdapter(adapter);
    if (questionCounter < questionCountTotal) {
        currentQuestion = questionList.get(questionCounter);

        answered = false;
        btnConfirmNext.setText("Confirm");

    } else {
        finishQuiz();
    }
}


//How should I handle it in onbindViewHolder

private void checkAnswer() {
    answered = true;
    countDownTimer.cancel();
    RadioButton rbSelected = findViewById(rbGroup.getCheckedRadioButtonId());
    int answerNb = rbGroup.indexOfChild(rbSelected) + 1;

    if (answerNb == currentQuestion.getAnswerNB()) {
        score++;
        tvScore.setText("Score: " + score);
    }
    showSolution();
}

//How should I change state of the items in recycle view

private void showSolution() {
    rb1.setTextColor(Color.RED);
    rb2.setTextColor(Color.RED);
    rb3.setTextColor(Color.RED);
    rb4.setTextColor(Color.RED);

    switch (currentQuestion.getAnswerNB()) {
        case 1:
            rb1.setTextColor(Color.GREEN);
            break;
        case 2:
            rb2.setTextColor(Color.GREEN);
            break;
        case 3:
            rb3.setTextColor(Color.GREEN);
            break;
        case 4:
            rb4.setTextColor(Color.GREEN);
            break;
    }

    btnConfirmNext.setText("Finish");

}

问题适配器

public class QuestionAdapter extends RecyclerView.Adapter<QuestionAdapter.MyViewHolder> {

public ArrayList<Question> questionList;

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView tvQuestion, tvScore, tvQuestionCount, tvCountdown;
    public RadioGroup rbGroup;
    public RadioButton rb1, rb2, rb3, rb4;



    public MyViewHolder(View view) {
        super(view);
        tvQuestion = view.findViewById(R.id.question);
        rbGroup = view.findViewById(R.id.radiog_group);
        rb1 = view.findViewById(R.id.radio_button1);
        rb2 = view.findViewById(R.id.radio_button2);
        rb3 = view.findViewById(R.id.radio_button3);
        rb4 = view.findViewById(R.id.radio_button4);
    }
}


public QuestionAdapter(Context mContext, ArrayList<Question> questionList) {
    this.questionList = questionList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.question_card, parent, false);


    return new MyViewHolder(itemView);
}

@NonNull
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    final Question question = questionList.get(position);
    holder.tvQuestion.setText(question.getQuestion());
    holder.rb1.setText(question.getOption1());
    holder.rb2.setText(question.getOption2());
    holder.rb3.setText(question.getOption3());
    holder.rb4.setText(question.getOption4());

    holder.rbGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {

// How can I handle Check status here and pass it to main activity?

        }
    });
}

@Override
public int getItemCount() {
    return questionList.size();
}
}

更新。 在向我的 QuestionAdapter 添加接口(interface)并对构造函数和其他部分进行更改后,我在 MainActivity 中的 checkAnswer 看起来像这样

    private void checkAnswer() {
    answered = true;
    countDownTimer.cancel();
    adapter = new QuestionAdapter(getApplicationContext(), questionList, new QuestionAdapter.OnItemListener() {
        @Override
        public void onItemSelect(int position) {
           if (position+1==currentQuestion.getAnswerNB()){
               score++;
               tvScore.setText("Score: " + score);
           }
        }
        });
    showSolution();
}

现在我应该如何处理我的 showSolution 方法? 似乎在 checkAnswer 之后我应该将信息发送回 QuestionAdapter 并在那里执行 setTextColor 。可能我走错了路......

最佳答案

你可以通过使用界面来做到这一点。

像这样创建一个接口(interface):

public interface OnItemListener {
    public void onItemSelect(int position);
}

然后在您的适配器中像这样更改构造函数:

  QuestionAdapter(Context mContext, ArrayList<Question> questionList, OnItemListener 
  onItemListener) {
        this.onItemListener = onItemListener;
        this.questionList = questionList;
    }

并将这一行添加到您的 onCheckedChangeListener

            onItemListener.onItemSelect(position);

像这样:

holder.rbGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, @IdRes int i) {

        // How can I handle Check status here and pass it to main activity?
        onItemListener.onItemSelect(position);
        }
    });

然后在你的 Activity 中添加这个你定义适配器的地方(这是定义适配器的另一种方式,你也可以使用你自己的方式只记得像这样添加接口(interface)(新的 OnItemListener ...)):

 dbHelper = new QuizDbHelper(getApplicationContext(), questionList, new 
 OnItemListener({

            @Override
            public void onItemSelect(int position) {
             // handle your check state of adapter item here
            }

        });

关于android - 检查 Recyclerview Adapter 中的单选按钮状态并从 MainActivity 对其应用更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52520753/

有关android - 检查 Recyclerview Adapter 中的单选按钮状态并从 MainActivity 对其应用更改的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  6. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  10. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

随机推荐