0

J'avais le support suivant qui fonctionnait, c'est-à-dire que j'étais capable de cocher/décocher la case. (La case à cocher fait partie de la RecyclerView carte):Comment implémenter l'élément Android Recyclerview, cliquez sur ET l'élément de la case à cocher, cliquez sur?

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.bindData(numbers.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(numbers.get(position).isSelected()); 

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     numbers.get(holder.getAdapterPosition()).setSelected(isChecked); 
     } 
    }); 
} 

Je voulais mettre en œuvre un clic de l'élément sur RecyclerView. Donc, j'ai pris de cette solution - s'il vous plaît vérifier: https://stackoverflow.com/a/26196831/4013399

Cependant, maintenant, le clic de l'ensemble de l'élément de la carte fonctionne, mais la case ne peut pas être cochée/décochée. Comment résoudre ceci?

Aidez-nous s'il vous plaît. Merci.

Mise à jour

J'ai fait des changements - cependant, "ICI-1,2 et 3" lignes sont jamais entrée.

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
Log.e("I AM ", "HERE-0"); 
holder.bindData(numbers.get(position)); 

final RelativeLayout rlyItem = holder.rlyItem; 
final CheckBox checkbox = holder.checkbox; 

rlyItem.setOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View view) { 
     mListener.onItemClicked(holder.getLayoutPosition()); 
     Log.e("I AM ", "HERE-1"); 
    } 
}); 

checkbox.setOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View view) { 
     if (((CheckBox) view).isChecked()) { 
      checkbox.setChecked(false); 
      Log.e("I AM ", "HERE-2"); 
     } else { 
      checkbox.setChecked(true); 
      Log.e("I AM ", "HERE-3"); 
     } 
     // Inform to Activity or the Fragment where the RecyclerView reside. 
     mListener.onItemCheckBoxChecked(((CheckBox) view).isChecked(), holder.getLayoutPosition()); 
    } 
}); 
//in some cases, it will prevent unwanted situations 
holder.checkbox.setOnCheckedChangeListener(null); 

//if true, your checkbox will be selected, else unselected 
holder.checkbox.setChecked(numbers.get(position).isSelected()); 

checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     numbers.get(holder.getAdapterPosition()).setSelected(isChecked); 
     Log.e("I AM ", "HERE-4"); 
     //Log.e(Integer.toString(holder.getAdapterPosition()), " IS CHECKED"); 
    } 
}); 

}

+0

Vous devez actualiser l'article lorsqu'il est coché. Vous pouvez utiliser 'notifyItemChanged (int position)' dans votre adaptateur –

Répondre

2

d'abord vous ajoutez la propriété ci-dessous dans votre case

android:clickable="false" 
     android:focusable="false" 
     android:longClickable="false" 

Ci-dessous mon itemClick

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         Utils.hideSoftKeyboard(getActivity()); 
         cityAdapter.itemSelected(position); 
        } 
       })); 

AJOUTZ méthode dans votre adaptateur:

public void itemSelected(final int position) { 
     if (townModelArrayList != null && !townModelArrayList.isEmpty()) { 
      townModelArrayList.get(position).setSelected(!townModelArrayList.get(position).isSelected()); 
      notifyDataSetChanged(); 
     } 
    } 
1

Appelez simplement performClick() pour votre case clic de votre adaptateur vue gonflé en classe d'adaptation.

holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      holder.checkbox.performClick(); 
     } 
    }); 
+0

Oui, j'ai essayé cela, mais n'a fait aucun changement. La case à cocher n'est toujours pas cliquable. – Zac

+0

J'ai supprimé l'ensemble de la "carte article" cliquez sur et fait un texte sur onClick et checkbox onClick mise en œuvre comme vous l'avez fait. Cependant, pouvez-vous maintenant expliquer comment sauvegarder l'état de la case à cocher lorsque l'utilisateur revient à l'activité? Cela sera utile. Merci. – Zac

-1

TL; DR

Pour implémenter le clic de l'élément RecyclerView et une vue cliquable dans l'élément RecyclerView, vous devez définir un écouteur pour chacun d'entre eux.

D'abord, vous devez définir la mise en page:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    > 
    <RelativeLayout 
     android:id="@+id/item__rly" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="?android:selectableItemBackground" 
     android:clickable="true" 
     > 

    <CheckBox 
    android:id="@+id/item_cbx" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Sample CheckBox" /> 

    </RelativeLayout> 

</android.support.v7.widget.CardView> 

à partir du code XML ci-dessus, vous pouvez constater que le RelativeLayout en utilisant:

android:background="?android:selectableItemBackground" 
android:clickable="true" 

Ceci est de faire l'élément ayant une animation lorsque cliqué.

Deuxièmement, vous devez définir l'interface, cliquez auditeur au sein de votre adaptateur, quelque chose comme ceci:

public class YourAdapter extends 
    RecyclerView.Adapter<YourAdapter.ViewHolder> { 

    private List<YourData> mDatas; 

    // Define listener member variable 
    private static OnRecyclerViewItemClickListener mListener; 

    // Define the listener interface 
    public interface OnRecyclerViewItemClickListener { 
    void onItemClicked(int position); 
    void onItemCheckBoxChecked(boolean isChecked, int position); 
    } 

    // Define the method that allows the parent activity or fragment to define the listener. 
    public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener listener) { 
    this.mListener = listener; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
    RelativeLayout rlyItem; 
    CheckBox cbxSample; 

    // We also create a constructor that accepts the entire item row 
    // and does the view lookups to find each subview 
    public ViewHolder(View itemView) { 
     // Stores the itemView in a public final member variable that can be used 
     // to access the context from any ViewHolder instance. 
     super(itemView); 
     rlyItem = (RelativeLayout) itemView.findViewById(R.id.item__rly); 
     cbxSample = (CheckBox) itemView.findViewById(R.id.item_cbx); 
    } 
    } 

    // Usually involves inflating a layout from XML and returning the holder 
    @Override public ViewHolder onCreateViewHolder(ViewGroup parent, 
     int viewType) { 
    Context context = parent.getContext(); 
    LayoutInflater inflater = LayoutInflater.from(context); 

    // Inflate the custom layout 
    View viewHolder = inflater.inflate(R.layout.item_layout, parent, false); 

    // Return a new holder instance 
    return new ViewHolder(viewHolder); 
    } 

    // Involves populating data into the item through holder 
    @Override public void onBindViewHolder(final ViewHolder viewHolder, int position) { 
    // Get the data model based on position 
    final YourData data = mDatas.get(position); 

    final RelativeLayout rlyItem = viewHolder.rlyItem; 
    CheckBox cbxSample = viewHolder.cbxSample; 

    rlyItem.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View view) { 
     mListener.onItemClicked(viewHolder.getLayoutPosition()); 
     } 
    }); 

    cbxSample.setOnClickListener(new View.OnClickListener() { 
     @Override public void onClick(View view) { 
     if (((CheckBox) v).isChecked()) { 
      cbxSample.setChecked(false); 
     } else { 
      cbxSample.setChecked(true); 
     } 
     // Inform to Activity or the Fragment where the RecyclerView reside. 
     mListener.onItemCheckBoxChecked(((CheckBox) v).isChecked(), viewHolder.getLayoutPosition()); 
     } 
    }); 

    } 

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

Ensuite, dans votre activité ou Fragment où le code de RecyclerView résident, vous devez définir l'auditeur:

yourAdapter.setOnRecyclerViewItemClickListener(new YourAdapter.OnRecyclerViewItemClickListener() { 
    @Override 
    public void onItemClicked(int position) { 
    // Do something when item clicked. 
    } 

    @Override 
    public void onItemCheckBoxChecked(boolean isChecked, int position) { 
    // Do something when check box check state change. 
    } 
}); 

Addition:
pour tenir l'état de l'article dans votre ReyclerView, vous devez utiliser SparseBooleanArray

+0

J'ai corrigé ce qui précède en utilisant votre code itemclick ... Cependant, mon adaptateur ne reconnaît pas la méthode OnRecyclerViewItemClickListener si je le fais dans votre code - [adapter.setOnRecyclerViewItemClickListener (new adapter.OnRecyclerViewItemClickListener() {...] - Comment – Zac

+0

Impossible de résoudre le symbole OnRecyclerViewItemClickListener sur [new adapter.OnRecyclerViewItemClickListener] – Zac

+0

En outre, en raison de la RelativeLayout, ma case à cocher n'est pas visible sur la carte.Aidez-moi à comprendre – Zac

0

J'ai résolu ce problème par en supprimant toute la classe référencée dans le lien de question (https://stackoverflow.com/a/26196831/4013399). Au lieu de cela, j'ai implémenté un écouteur onClick uniquement pour la case à cocher. Et pour tout l'article de vue de carte, cliquez sur?, Vous pouvez demander. Pour cela, j'ai simplement implémenté un autre écouteur onClick pour une mise en page qui contenait ma zone de texte. Aussi, pour enregistrer l'état des cases à cocher un simple réglage et obtention de clé, paires de valeur comme (case à cocher position, "1") (où 1 indique vérifié) et simultanément mettre à jour dans les SharedPreferences travaillé.

1

J'ai écrit une bibliothèque pour gérer l'événement click click d'un recycleur Android. Vous pouvez trouver tutoriel entier dans https://github.com/ChathuraHettiarachchi/RecycleClick

RecycleClick.addTo(YOUR_RECYCLEVIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() { 
      @Override 
      public void onItemClicked(RecyclerView recyclerView, int position, View v) { 
       // YOUR CODE 
      } 
     }); 

ou pour gérer un objet appui long, vous pouvez utiliser

RecycleClick.addTo(YOUR_RECYCLEVIEW).setOnItemLongClickListener(new RecycleClick.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClicked(RecyclerView recyclerView, int position, View v) { 
       // YOUR CODE 
       return true; 
      } 
     }); 

à poignée case clic, vous devez setCheckChangeListner sur votre adaptateur

+0

Merci! Cela m'a aidé :) – MSeiz5