En mi código que he de crear recyclerview con la casilla de verificación y defecto de un elemento seleccionado ya. ahora quiero que cuando seleccione otro elemento de la casilla de selección para anular la selección de todos los demás elementos de la media de un elemento select en el tiempo.

Mi Adaptador código:

public class SupportSchoolIdAdapter extends RecyclerView.Adapter<SupportSchoolIdAdapter.ViewHolder> {
ArrayList<SupportSchoolIdModel> supportSchoolIdModels;
DataPref mDataPref;
String supportSchoolId;
public SupportSchoolIdAdapter(List<SupportSchoolIdModel> supportSchoolIdModels) {
this.supportSchoolIdModels = new ArrayList<>(supportSchoolIdModels);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
mDataPref = DataPref.getInstance(context);
supportSchoolId = mDataPref.getSupportSchoolId();
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.support_school_item, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final SupportSchoolIdModel event = supportSchoolIdModels.get(position);
holder.bindData(supportSchoolIdModels.get(position));
//in some cases, it will prevent unwanted situations
holder.checkbox.setOnCheckedChangeListener(null);
//if true, your checkbox will be selected, else unselected
holder.checkbox.setChecked(supportSchoolIdModels.get(position).isSelected());
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
supportSchoolIdModels.get(holder.getAdapterPosition()).setSelected(isChecked);
}
});
if (supportSchoolIdModels.get(position).getPkSchoolId().equalsIgnoreCase(supportSchoolId)) {
holder.checkbox.setChecked(true);
} else {
holder.checkbox.setChecked(false);
}
}
@Override
public int getItemCount() {
return supportSchoolIdModels.size();
}
//Provide a reference to the views for each data item
//Complex data items may need more than one view per item, and
//you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
//each data item is just a string in this case
private TextView schoolIdTxt;
private TextView schoolNameTxt;
private CheckBox checkbox;
public ViewHolder(View v) {
super(v);
schoolIdTxt = (TextView) v.findViewById(R.id.schoolIdTxt);
schoolNameTxt = (TextView) v.findViewById(R.id.schoolNameTxt);
checkbox = (CheckBox) v.findViewById(R.id.checkbox);
}
public void bindData(SupportSchoolIdModel supportSchoolIdModel) {
schoolIdTxt.setText(supportSchoolIdModel.getPkSchoolId());
schoolNameTxt.setText(supportSchoolIdModel.getSchoolName());
}
}
}

Y el Segundo problema es que cuando me desplazo a la papelera de ver por qué el elemento seleccionado desactivada. por favor me ayude.

  • Ok. Usted debe primero resolver: si el usuario seleccione un elemento y, a continuación, se desplaza el elemento en la vista de que la casilla de verificación que todavía está activada. Este problema bas denunciado muchas veces y no hay una solución simple con el uso de una matriz de tipo boolean. Un valor booleano para cada elemento. El valor booleano que indica si la casilla de verificación tiene que ser revisado. Google para el código. Una vez que usted haya dominado de que la desactivación de otras cajas es bastante simple.
  • no me explico por qué casilla de verificación desactivada. No quiero que esto @greenapps
  • Sí me entiende. Eso es exactamente lo que me refería.
  • He encontrado un montón de soluciones, pero estoy fallando

4 Comentarios

  1. 13

    1 – Usted puede crear una variable dentro de Adaptador de clase que pueden ser utilizados para mantener la posición seleccionada:

    private int selectedPosition = -1;//no selection by default

    2 – Dentro de onBindViewHolder establecer el Estado de la Comprobación:

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

    3 – Dentro de setOnCheckedChangeListener debe actualizar la posición

    this.selectedPosition = holder.getAdapterPosition();

    4 – Actualizar el adaptador de

    adapter.notifyDatasetChanged();

    EDITAR

    onBindViewHolder será llamado para todas las posiciones,

    Por lo que el método setChecked será llamado para que todas las Casillas,
    Este método tiene un valor booleano entrada.

    En el ejemplo de arriba escribo setChecked(selectedPosition == position). Para obtener más legible puedo escribir:

    if(selectedPosition == position){ 
    holder.checkBox.setChecked(true);
    }
    else{
    holder.checkBox.setChecked(false) 
    }
    • Ok. Simple pero sólo funcionará si usted llama a un adaptador.notifyDataSetChanged() demasiado.
    • Sí, lo siento, me perdí una línea
    • onBindViewHolder será llamada por todas las posiciones. Por lo que el método setChecked será llamado para que todas las casillas. Este método tiene un valor booleano entrada. En el ejemplo de arriba escribo setChecked(selectedPosition == posición). Para obtener más legible puedo escribir `si(selectedPosition == posición){ setChecked(true)}else{ setChecked(false) }
    • Ellos se deselecciona automáticamente si usted llama notifyDatasetChanged(). Lo que hace de esta una muy buena solución.
    • en mi código me han llegar no puede resolver esto.selectedPosition variables en las que se definen
    • Usted se definen en el nivel de las variables globales ( por lo que a nivel de ArrayList<SupportSchoolIdModel> supportSchoolIdModels; DataPref mDataPref; String supportSchoolId;)
    • donde puedo definir adaptador.notifydatasetchanged();
    • aun no se ha resuelto titular.casilla de verificación.setOnCheckedChangeListener(nueva CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { this.selectedPosition = titular.getAdapterPosition(); } });
    • No se definir. pero la llamada. En onCheckedChanged. Después de selectedPosition = position; O selectedPositoio = -1 cuando el usuario anula la selección.
    • no hay error selectedPosition (no se puede resolver variable)
    • Para esta línea.selectedPosition = titular.getAdapterPosition(); ) selectedPosition variables en las que se [email protected]_droid_dev. He definir globle pero todavía no puede ser resuelto
    • Quitar el this.. Y hacer que una variable privada de su adaptador de clase.

  2. 1

    Usted puede utilizar a continuación el código; seguramente va a ayudar a ustedes,

    int selectedPosition=0;
    if (selectedPosition == position) {
    holder.itemView.setSelected(true); //using selector drawable
    GradientDrawable drawable = (GradientDrawable) holder.ll_portal.getBackground();
    drawable.setColor(getResources().getColor(R.color.darkorange));
    holder.tvPortalName.setTextColor(Color.parseColor("#FFFFFF"));
    } else {
    holder.itemView.setSelected(false);
    GradientDrawable drawable = (GradientDrawable) holder.ll_portal.getBackground();
    drawable.setColor(getResources().getColor(R.color.white));
    holder.tvPortalName.setTextColor(Color.parseColor("#000000"));
    }
    final int finalPosition = position;
    holder.ll_portal.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    totalDineInOrder= String.valueOf(gallaryModels.get(position).getDineInTotalOrder());
    totalPickupOrder= String.valueOf(gallaryModels.get(position).getPickupTotalOrder());
    selectedPosition= finalPosition;
    notifyDataSetChanged();
    }
    });
    • Gracias a la solución funcionó
  3. 0

    Como usted dijo, usted es nuevo en android primero te darás cuenta de que tu casilla de verificación tener problemas con el reciclador de vista.Has seleccionado algún elemento en la papelera de vista y después de desplazarse observará algún otro elemento es seleccionado para solucionar esto es necesario seguir esta respuesta.
    o
    Usted necesita para crear una variable booleana( para capturar el estado de la casilla seleccionada para cada elemento de reciclador de vista)en su Modelo de Escuela de la clase como esta

     class SchoolModel{
    private boolean isChecked;
    public boolean isChecked(){
    return ischecked;}
    public void setIsChecked(boolean checked){
    isChecked = checked;
    }
    }

    Segundo problema es seleccionar una casilla de verificación y anule la selección de resto de ellos, para esto usted necesita escribir su lógica(Marque aquí para la solución de).Y uno de los principales cambio de código es mover su setOnCheckedChangeListener para ver titular de clase porque bindviewholder es llamado cada vez que actualice su recyclerview y de esta manera establecer setOnCheckedChangeListener cada vez que no es correcto.Así que pongo esta escucha en vista de la titular de esta forma se asigna por casilla escucha sólo una vez.

     checkBoxDeleteComment.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    //your code
    }
    });
  4. 0

    clase pública MyTeamAdapter se extiende RecyclerView.Adaptador {
    privada Contexto contexto;
    privado ArrayList myTeams;

    private int prevSelection = -1;
    public MyTeamAdapter(Context context, ArrayList<Team> myTeams) {
    this.context = context;
    this.myTeams = myTeams;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_my_team, parent, false));
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
    final Team team = myTeams.get(position);
    ViewHolder viewHolder = (ViewHolder) holder;
    if (team.isTeamSelected()) {
    viewHolder.checkTeam.setChecked(true);
    prevSelection = position;
    } else {
    viewHolder.checkTeam.setChecked(false);
    }
    viewHolder.checkTeam.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    if (b) {
    team.setTeamSelected(true);
    if (prevSelection >= 0) {
    myTeams.get(prevSelection).setTeamSelected(false);
    notifyItemChanged(prevSelection);
    }
    prevSelection = position;
    } else {
    team.setTeamSelected(false);
    }
    }
    });
    }
    @Override
    public int getItemCount() {
    return myTeams.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
    RelativeLayout captainHolder, viceCaptainHolder;
    CheckBox checkTeam;
    TextView tvTeamName, tvCaptainName, tvCaptain, tvVCapName, tvVC, tvWcktKeeper, tvBatsMen, tvAllRounder, tvBowler;
    ImageView edtTeam, viewTeam, copyTeam;
    public ViewHolder(View itemView) {
    super(itemView);
    checkTeam = itemView.findViewById(R.id.cb_team);
    tvTeamName = itemView.findViewById(R.id.tv_team_name);
    captainHolder = itemView.findViewById(R.id.captain_holder);
    tvCaptainName = captainHolder.findViewById(R.id.tv_player_name);
    tvCaptain = captainHolder.findViewById(R.id.tv_player_type);
    viceCaptainHolder = itemView.findViewById(R.id.vc_holder);
    tvVCapName = viceCaptainHolder.findViewById(R.id.tv_player_name);
    tvVC = viceCaptainHolder.findViewById(R.id.tv_player_type);
    tvWcktKeeper = itemView.findViewById(R.id.tv_wckt_keeper);
    tvBatsMen = itemView.findViewById(R.id.tv_bats_men);
    tvAllRounder = itemView.findViewById(R.id.tv_all_rounder);
    tvBowler = itemView.findViewById(R.id.tv_baller);
    edtTeam = itemView.findViewById(R.id.edt_team);
    viewTeam = itemView.findViewById(R.id.view_team);
    copyTeam = itemView.findViewById(R.id.copy_team);
    }
    }

    }

    • Puede ser que esto podría ayudar.

Dejar respuesta

Please enter your comment!
Please enter your name here