亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

RecyclerView 單選按鈕不會只注冊最新檢查的項目(也記得以前的)

RecyclerView 單選按鈕不會只注冊最新檢查的項目(也記得以前的)

胡子哥哥 2023-04-26 14:03:13
我有 RecyclerView,它有多個項目,這些項目包含單選按鈕、課程名稱 (TextView) 和孔號 (TextView)。應該發生的是,當我單擊單選按鈕時,它應該只選擇那個 1,如果有之前的檢查,它應該取消選中它(單選)。好吧,目前它一次只檢查 1 個,這是可以的(因此前端可以正常工作),但是“在引擎蓋下”發生了什么......例如:RecyclerView 目前有 3 個項目。我單擊要檢查的第三個項目,然后單擊第一個,然后再次單擊第三個。現在我點擊“開始游戲”按鈕,應該發生的是它應該采用最后選中的項目(在本例中是最后選擇的第三個)并將其課程名稱和洞號用于下一個活動,但現在發生的是它意圖第一個項目課程名稱和洞號......另外,如果我和以前一樣,但我沒有點擊第一個項目,而是點擊第二個項目,然后即使最后我點擊了第三個項目,而不是意圖它的課程名稱和孔號,它意味著第二個項目......所以它總是意圖被點擊的項目(在某個時候)并且從那些被點擊的項目中它檢查第一個(從列表的頂部到底部)并接受它的意圖。這是我的適配器,我在其中檢查選擇了哪一個:public class NewGameCourseAdapter extends RecyclerView.Adapter<NewGameCourseAdapter.NewGameCourseViewHolder> {    private ArrayList<NewGameCourseItem> mCourseList;    private NewGamePlayerAdapter.OnItemsCheckStateListener checkStateListener;private NewGameCourseAdapter.OnItemClickListener itemClickListener;public void setOnItemClickListener(NewGameCourseAdapter.OnItemClickListener listener) {    itemClickListener = listener;}public interface OnItemClickListener {    void onItemClick(int position);}public void setOnItemsCheckStateListener(NewGamePlayerAdapter.OnItemsCheckStateListener checkStateListener) {    this.checkStateListener = checkStateListener;}public static class NewGameCourseViewHolder extends RecyclerView.ViewHolder {        public RadioButton mRadioButton;        public NewGameCourseViewHolder(@NonNull View itemView, final NewGameCourseAdapter.OnItemClickListener listener) {            super(itemView);            mRadioButton = itemView.findViewById(R.id.radioButton);        }    }onBindViewHolder:@Override    public void onBindViewHolder(@NonNull final NewGameCourseViewHolder holder, final int position) {        final NewGameCourseItem currentItem = mCourseList.get(position);        /** This can prevent some unwanted actions in some cases **/        holder.mRadioButton.setOnCheckedChangeListener(null);        holder.mRadioButton.setChecked(selectedPosition == position);摘要:在前端它看起來是正確的,它只選擇最后單擊的那個單選按鈕并取消選中前一個(它應該),但在內部,它不會像它應該做的那樣“忘記”以前的選擇......
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

你正在做一些奇怪的事情,如果可能的話讓它變得簡單。


第 1 步:在您的適配器類中創建一個方法來獲取所選項目


public NewGameCourseItem getSelectedItem() {

   return mCourseList.get(selectedPosition);

}

第 2 步:然后修改您的點擊方法,如下所示


mStartGame.setOnClickListener(new View.OnClickListener() {

      @Override

      public void onClick(View view) {

         NewGameCourseItem  item = adapter.getSelecteditem();

         Intent intent = new Intent(ActivityNewGame2.this, ActivityGame.class);

         /** Also intent selected items: course name and hole number **/

         intent.putExtra("COURSENAME", item.getCourseName());

         intent.putExtra("HOLESNM", item.getHolesNm());

         startActivity(intent);

         overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

      }

 });

第 3 步:現在修改您的 onCheckedChanged 如下


 public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

     notifyItemChanged(selectedPosition);

     selectedPosition = holder.getAdapterPosition();

     notifyItemChanged(selectedPosition);

 }


查看完整回答
反對 回復 2023-04-26
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

在適配器中創建一個類變量


private int selectedPosition = -1; //change -1 to any default position, need to be selected.

修改適配器中的以下功能


@Override

public void onBindViewHolder(@NonNull final NewGameCourseViewHolder holder, final int position) {

    final NewGameCourseItem currentItem = mCourseList.get(position);


    holder.mRadioButton.setChecked(selectedPosition == position);


    holder.mRadioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override

        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            if(isChecked) {

                int tempSelected = selectedPosition;

                selectedPosition = position;

                notifyDataSetChanged();

            }

        }

    });

}

在適配器中創建一個新方法,如下所示 -


public int getSelectedItemIndex() {

    return selectedPosition;

}

我假設是Activity 類中adapter的變量。NewGameCourseAdapter修改Activity中的按鈕點擊:


mStartGame.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

        int selectedRecyclerItemPosition = adapter.getSelectedItemIndex();


        //Calling intent and pass selected item info

        Intent intent = new Intent(ActivityNewGame2.this, ActivityGame.class);

        /** Also intent selected items course name and hole number **/

        intent.putExtra("COURSENAME", mCourseList.get(selectedRecyclerItemPosition).getCourseName());

        intent.putExtra("HOLESNM", mCourseList.get(selectedRecyclerItemPosition).getHolesNm());

        startActivity(intent);

        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

    }

});


查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號