滚动时,两个复选框处于recyclerview更改状态

时间:2018-12-28 10:34:59

标签: android checkbox

修改

通过删除两行来解决问题

holder.checkbox.setChecked(mListenerList.get(position).isSelected());
holder.checkbox.setChecked(mListenerList.get(position).isSelected2());

并通过添加

  @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

我不为将来的开发人员编辑原始代码。

编辑之前的主要问题从这里开始

我正在开发幻想板球应用程序,从11位玩家的名单中选择队长和副队长。
我正在使用一个复选框来选择队长和副队长。

复选框的选择与我的代码配合得很好,但是问题是当我选择第一个玩家作为队长(C),第二个玩家作为副队长(VC),然后滚动列表时,复选框的状态正在改变,并且显示其他选中的玩家。

那么有什么正确的方法做那件事吗?
我已经尝试了多种方法,当有一个复选框时它们仍在工作,但就我而言,只有两个复选框,并且只能从列表中选择一个。

为清楚起见,请参阅底部的屏幕截图。

适配器类

public class AdapterFinalTeamList extends     RecyclerView.Adapter<AdapterFinalTeamList.MyViewHolder> {
    private List<BeanDBTeam> mListenerList;
    Context mContext;
    private  CheckBox lastChecked = null;
    private  int lastCheckedPos = 0;

    private  CheckBox lastChecked2 = null;
    private  int lastCheckedPos2 = 0;

    private RadioButton lastCheckedRB = null;
    private RadioButton lastCheckedRB1 = null;

    TextView PreviousCaptain = null;
    TextView PreviousVC = null;


    public AdapterFinalTeamList(List<BeanDBTeam>              mListenerList, Context context) {
        mContext = context;
        this.mListenerList = mListenerList;

    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tv_PlayerName,tv_SelectCaptain,tv_SelectViceCaptain, tv_PlayerTeamName, tv_PlayerPoints,tv_TeamNumber;
        ImageView im_PlayerImage,im_onetwox;
        CheckBox checkbox,checkbox2;

        RadioGroup radiogroup;
        RadioButton radio,radio2;


        public MyViewHolder(View view) {
            super(view);

            tv_PlayerName =view.findViewById(R.id.tv_PlayerName);
            tv_PlayerTeamName = view.findViewById(R.id.tv_PlayerTeamName);
            tv_PlayerPoints = view.findViewById(R.id.tv_PlayerPoints);

            im_PlayerImage = view.findViewById(R.id.im_PlayerImage);
            im_onetwox = view.findViewById(R.id.im_onetwox);


            tv_TeamNumber = view.findViewById(R.id.tv_TeamNumber);
            tv_SelectViceCaptain = view.findViewById(R.id.tv_SelectViceCaptain);
            tv_SelectCaptain= view.findViewById(R.id.tv_SelectCaptain);
            checkbox= view.findViewById(R.id.checkbox);
            checkbox2= view.findViewById(R.id.checkbox2);
            radiogroup= view.findViewById(R.id.radiogroup);
            radio= view.findViewById(R.id.radio);
            radio2= view.findViewById(R.id.radio2);

        }

    }

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

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

        return new MyViewHolder(itemView);
    }



    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {



        String id = mListenerList.get(position).getMatchId();

        String arrayList = (mListenerList.get(position).getPlayerData());
        try {
            JSONObject job = new JSONObject(arrayList);

            String PlayerName = job.getString("name");
            String PlayerImage = job.getString("image");
            String PlayerPoints = job.getString("player_points");
            String PlayerCredit = job.getString("credit_points");
            String TeamShortName = job.getString("team_short_name");

            String team_number = job.getString("team_number");
            String player_shortname = job.getString("player_shortname");
            holder.tv_TeamNumber.setText(team_number);
            // PlayerTeam= job.getString("short_name");

            holder.tv_PlayerName.setText(PlayerName);

            holder.tv_PlayerPoints.setText(PlayerPoints);
            holder.tv_PlayerTeamName.setText(TeamShortName);


            Glide.with(activity).load(Config.PLAYERIMAGE + PlayerImage)
                    .crossFade()
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.im_PlayerImage);

        } catch (JSONException e) {
            e.printStackTrace();
        }
holder.checkbox.setChecked(mListenerList.get(position).isSelected());
        holder.checkbox.setTag(new Integer(position));

        holder.checkbox.setChecked(mListenerList.get(position).isSelected2());
        holder.checkbox2.setTag(new Integer(position));



        holder.checkbox.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {

                CheckBox cb = (CheckBox) v;
                int clickedPos = ((Integer) cb.getTag()).intValue();
                    holder.checkbox2.setChecked(false);

                    if (cb.isChecked()) {
                        if (lastChecked != null) {
                            mListenerList.get(lastCheckedPos).setSelected(false);
                            lastChecked.setChecked(false);
                        }
                        else if (clickedPos==position){
                            lastCheckedPos = clickedPos;
                            lastChecked = cb;
                            lastChecked.setChecked(true);
                        }
                        lastCheckedPos = clickedPos;
                        lastChecked = cb;
                    } else
                        lastChecked = null;

                    try {
                        lastChecked.setChecked(true);
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }

                    mListenerList.get(clickedPos).setSelected(cb.isChecked());
                    CaptainId = mListenerList.get(position).getPlayerId();


            }
        });
    holder.checkbox2.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v) {
                CheckBox cb = (CheckBox) v;
                int clickedPos = ((Integer) cb.getTag()).intValue();

                holder.checkbox.setChecked(false);

                    if (cb.isChecked()) {
                        if (lastChecked2 != null) {
                            lastChecked2.setChecked(false);
                            mListenerList.get(lastCheckedPos2).setSelected(false);
                        }
                        else if (clickedPos==position){
                            lastChecked2 = cb;
                            lastCheckedPos2 = clickedPos;
                            lastChecked2.setChecked(true);
                        }

                        lastChecked2 = cb;
                        lastCheckedPos2 = clickedPos;
                    } else
                        lastChecked2 = null;

                    try{
                lastChecked2.setChecked(true);
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                    mListenerList.get(clickedPos).setSelected2(cb.isChecked());
                ViceCaptainId = mListenerList.get(position).getPlayerId();

                }

        });


    }

}

adapter_final_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res /android"
android:layout_width="match_parent"
android:background="@color/white"
android:layout_height="wrap_content">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    android:padding="5dp"
    android:id="@+id/RL_PlayerListMain"
    android:elevation="0dp">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv_TeamNumber"

    android:visibility="invisible"/>
<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:src="@drawable/logo"
    android:layout_centerVertical="true"
    android:id="@+id/im_PlayerImage"/>
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:id="@+id/RL_Name"
    android:layout_toRightOf="@+id/im_PlayerImage"
    android:layout_marginLeft="10dp">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Player Name"
    android:id="@+id/tv_PlayerName"
    android:textColor="#1e1e1e"
    />
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center"
    android:layout_below="@+id/tv_PlayerName">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="IND"
        android:layout_gravity="center"
        android:layout_marginRight="5dp"
        android:id="@+id/tv_PlayerTeamName"
        android:textColor="#1e1e1e"
        />
    <View
        android:layout_width="1dp"
        android:layout_height="10dp"
        android:layout_gravity="center"
        android:background="#8e8e8e"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="55 Points"
        android:layout_gravity="center"
        android:id="@+id/tv_PlayerPoints"
        android:textColor="#8e8e8e"
        android:layout_marginLeft="5dp"
        />
</LinearLayout>
</RelativeLayout>
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:id="@+id/RL_Credit"
    android:layout_alignParentRight="true">
    <TextView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:text="C"
        android:padding="10dp"
        android:textAlignment="center"
        android:gravity="center"
        android:visibility="gone"
        android:layout_centerVertical="true"
        android:background="@drawable/circle_captain_vc_back"
        android:id="@+id/tv_SelectCaptain"
        android:textColor="#1e1e1e"
        android:layout_marginLeft="10dp"
        />

    <CheckBox
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_toRightOf="@+id/tv_SelectViceCaptain"
        android:layout_centerVertical="true"
        android:visibility="visible"
        android:text="C"
        android:textColor="#1e1e1e"
        android:gravity="center"
        android:button="@android:color/transparent"
        android:background="@drawable/radio_selector"
        android:id="@+id/checkbox"/>
    <CheckBox
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_toRightOf="@+id/checkbox"
        android:layout_centerVertical="true"
        android:visibility="visible"
        android:text="VC"
        android:layout_marginLeft="5dp"
        android:textColor="#1e1e1e"
        android:gravity="center"
        android:button="@android:color/transparent"
        android:background="@drawable/radio_vc_selector"
        android:id="@+id/checkbox2"/>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/onex_icon"
        android:visibility="invisible"
        android:layout_centerHorizontal="true"
        android:id="@+id/im_onetwox"
        />

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/radiogroup"
        android:visibility="gone"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/im_onetwox"
        android:orientation="horizontal">
    <RadioButton
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_toRightOf="@+id/tv_SelectViceCaptain"
        android:layout_centerVertical="true"
        android:visibility="visible"
        android:text="C"
        android:layout_marginRight="10dp"
        android:gravity="center"
        android:background="@drawable/radio_selector"
        android:button="@android:color/transparent"
        android:id="@+id/radio"/>
    <RadioButton
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_toRightOf="@+id/checkbox"
        android:layout_centerVertical="true"
        android:visibility="visible"
        android:text="VC"
        android:gravity="center"
        android:background="@drawable/radio_vc_selector"
        android:button="@android:color/transparent"
        android:id="@+id/radio2"/>
    </RadioGroup>



    <TextView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:text="VC"
        android:textAlignment="center"
        android:gravity="center"
        android:visibility="gone"
        android:padding="10dp"
        android:layout_toRightOf="@+id/tv_SelectCaptain"
        android:layout_centerVertical="true"        android:background="@drawable/circle_captain_vc_back"
        android:id="@+id/tv_SelectViceCaptain"
        android:textColor="#1e1e1e"
        android:layout_marginLeft="10dp"
        />


</RelativeLayout>

</RelativeLayout>

<View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#8e8e8e"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="2dp"
    android:layout_marginRight="5dp"
    android:layout_marginLeft="5dp"
    android:layout_below="@+id/RL_PlayerListMain"/>
 </RelativeLayout>

选择C和VC

1. Selecting C and VC

从顶部滚动到底部并从底部滚动到顶部

2. After scrolling top to bottom and bottom to top.

请忽略广播组。我的代码可以与复选框配合使用,只能在滚动时产生问题。

3 个答案:

答案 0 :(得分:1)

对于 checkbox ,您需要使用 checkbox.OnCheckedChangeListener() 代替 checkbox.setOnClickListener()

按照此步骤

在您的 BeanDBTeam 类中添加新的布尔变量

public class BeanDBTeam
{               
    boolean isChecked;    

    public boolean getisChecked() {
        return isChecked;
    }

    public void setIsChecked(boolean flag) {
        isChecked= flag;
    }
}

现在在您内部 onBindViewHolder() 添加以下代码

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
    BeanDBTeam  bean = mListenerList.get(position).getisChecked()

    // check here the flag and status of checkbox  based on flag
    holder.checkbox2.setChecked(bean.getisChecked());

    holder.checkbox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
              // set flag of checkbox status  in your list when user check or uncheck the checkbox
             bean.setIsChecked(isChecked);
             notifyDataChanged();
          }
    }); 
 }            

答案 1 :(得分:0)

@Nilesh 所建议的那样,为了将Bean类用于checkbox状态,请记住以下功能:

 /**
 * CheckType ==>>1 For the first checkbox
 * CheckType ==>>2 For the second checkbox
 * CheckType ==>>0 For the None
 */         
public class BeanDBTeam
{
    int checkType;


    public int getCheckType() {
        return checkType;
    }

    public void setCheckType(int checkType) {
        this.checkType = checkType;
    }
}

MyViewHolder 内,您需要应用 setOnCheckedChangeListener 侦听器并从 getAdapterPosition()获得位置strong>如下所示

 public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView tv_PlayerName, tv_SelectCaptain, tv_SelectViceCaptain, tv_PlayerTeamName, tv_PlayerPoints, tv_TeamNumber;
    ImageView im_PlayerImage, im_onetwox;
    CheckBox checkbox, checkbox2;

    RadioGroup radiogroup;
    RadioButton radio, radio2;


    public MyViewHolder(View view) {
        super(view);

        tv_PlayerName = view.findViewById(R.id.tv_PlayerName);
        tv_PlayerTeamName = view.findViewById(R.id.tv_PlayerTeamName);
        tv_PlayerPoints = view.findViewById(R.id.tv_PlayerPoints);

        im_PlayerImage = view.findViewById(R.id.im_PlayerImage);
        im_onetwox = view.findViewById(R.id.im_onetwox);


        tv_TeamNumber = view.findViewById(R.id.tv_TeamNumber);
        tv_SelectViceCaptain = view.findViewById(R.id.tv_SelectViceCaptain);
        tv_SelectCaptain = view.findViewById(R.id.tv_SelectCaptain);
        checkbox = view.findViewById(R.id.checkbox);
        checkbox2 = view.findViewById(R.id.checkbox2);
        radiogroup = view.findViewById(R.id.radiogroup);
        radio = view.findViewById(R.id.radio);
        radio2 = view.findViewById(R.id.radio2);

        /**
         * NOW WE APPLY THE setOnCheckedChangeListener functionality for the checkboxlistener
         */

        checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // set flag of checkbox status  in your list when user check or uncheck the checkbox
                if (checkbox) {
                    YOUR_ARRAYLIST.get(getAdapterPosition()).setCheckType(1);
                }
                else {
                    YOUR_ARRAYLIST.get(getAdapterPosition()).setCheckType(0);
                }
                notifyDataChanged();
            }
        });

        checkbox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // set flag of checkbox status  in your list when user check or uncheck the checkbox
                if (checkbox) {
                    YOUR_ARRAYLIST.get(getAdapterPosition()).setCheckType(2);
                }
                else {
                    YOUR_ARRAYLIST.get(getAdapterPosition()).setCheckType(0);
                }
                notifyDataChanged();
            }
        });


    }
}

onBindViewHolder 中,我们需要根据以下选择设置Checkbox

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
    BeanDBTeam  bean = mListenerList.get(position).getisChecked()

    // check here the flag and status of checkbox  based on flag
    if(bean.getCheckType()==0) {
        holder.checkbox.setChecked(false);
        holder.checkbox2.setChecked(false);

    }
    else if(bean.getCheckType()==1) {
        holder.checkbox.setChecked(true);
        holder.checkbox2.setChecked(false);

    }
    else if(bean.getCheckType()==2) {
        holder.checkbox.setChecked(false);
        holder.checkbox2.setChecked(true);

    }

}

答案 2 :(得分:0)

这就是回收行为,您可以使用其他正确的答案,但由于列表中的条目有限,因此您实际上可以禁用回收您的recyclerview。在适配器中使用以下代码:

@Override
public void onBindViewHolder(final CommentViewHolder viewHolder, final int position) {
    viewHolder.setIsRecyclable(false);
}