J'ai rempli le recyclerView avec une image, un titre et une case à cocher ... J'ai deux problèmes.
Comment faire en sorte que la case à cocher soit sélectionnée lorsque l'on clique sur l'imageview ou sur l'ensemble du recycleur.
Je dois passer à l'activité suivante en récupérant tous les éléments cochés de la vue de recyclage.
Ma mise en page:
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_margin="8dp">
<ImageView
Android:id="@+id/image"
Android:layout_width="match_parent"
Android:layout_height="150dp"
Android:layout_gravity="center_horizontal"
Android:contentDescription="Interests"
Android:scaleType="centerCrop"
Android:src="@drawable/ic_yash_dp" />
<TextView
Android:id="@+id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true"
Android:layout_gravity="bottom"
Android:layout_margin="5dp"
Android:layout_marginTop="24dp"
Android:background="@drawable/rounded_corners"
Android:gravity="bottom"
Android:padding="5dp"
Android:text="GYM"
Android:textAlignment="center"
Android:textColor="@color/white" />
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/checkBox"
Android:layout_margin="2dp"
Android:layout_alignParentTop="true"
Android:layout_alignParentRight="true"
Android:layout_alignParentEnd="true" />
</RelativeLayout>
Mon adaptateur:
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
final InterestBean model = arrayList.get(position);
final int pos = position;
RecyclerViewHolder mainHolder = (RecyclerViewHolder) holder;// holder
Bitmap image = BitmapFactory.decodeResource(context.getResources(),
model.getImage());// This will convert drawbale image into bitmap
// setting title
mainHolder.title.setText(model.getTitle());
mainHolder.imageview.setImageBitmap(image);
mainHolder.checkBox.setChecked(arrayList.get(position).isSelected());
mainHolder.checkBox.setTag(arrayList.get(position));
mainHolder.checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
InterestBean contact = (InterestBean) cb.getTag();
contact.setIsSelected(cb.isChecked());
arrayList.get(pos).setIsSelected(cb.isChecked());
selectedItems.add(pos);
Toast.makeText(
v.getContext(), pos + cb.isChecked(), Toast.LENGTH_LONG).show();
}
});}
Une solution simple peut être de créer OnItemCheckLister
et de l’implémenter comme suit:
public class MyAdapter extends RecyclerViewAdapter {
interface OnItemCheckListener {
void onItemCheck(Item item);
void onItemUncheck(Item item);
}
...
@NonNull
private OnItemCheckListener onItemCheckListener;
public MyAdapter (List<Item> items, @NonNull OnItemCheckListener onItemCheckListener) {
this.items = items;
this.onItemClick = onItemCheckListener;
}
...
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (holder instanceof MyViewHolder) {
final Item currentItem = items.get(position);
...
((MyViewHolder) holder).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MyViewHolder) holder).checkbox.setChecked(
!((MyViewHolder) holder).checkbox.isChecked());
if (((MyViewHolder) holder).checkbox.isChecked()) {
onItemClick.onItemCheck(currentItem);
} else {
onItemClick.onItemUncheck(currentItem);
}
}
});
}
}
static class MyViewHolder extends RecyclerView.ViewHolder {
CheckBox checkbox;
View itemView;
...
public MyViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
checkbox = (CheckBox) itemView.findViewById(R.id.checkbox);
checkbox.setClickable(false);
...
}
public void setOnClickListener(View.OnClickListener onClickListener) {
itemView.setOnClickListener(onClickListener);
}
}
}
Ensuite, dans l'activité, nous pouvons faire ceci:
private List<Item> currentSelectedItems = new ArrayList<>();
...
myAdapter = new MyAdapter(items, new MyAdapter.OnItemCheckListener() {
@Override
public void onItemCheck(Item item) {
currentSelectedItems.add(item);
}
@Override
public void onItemUncheck(Item item) {
currentSelectedItems.remove(item);
}
});
Ensuite, vous pouvez faire des choses avec currentSelectedItems
.
Remarque: Étant donné que cette solution suppose que l’ensemble de l’élément soit utilisé, la case à cocher est configurée pour ne pas cliquer.
Vous pouvez utiliser la classe Model pour obtenir les éléments cochés recyclerView. Plus de références: Android Recyclerview checkbox
Modèle
public class Model {
private boolean isSelected;
private String animal;
public String getAnimal() {
return animal;
}
public void setAnimal(String animal) {
this.animal = animal;
}
public boolean getSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
Adaptateur
import Android.content.Context;
import Android.support.v7.widget.RecyclerView;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.CheckBox;
import Android.widget.TextView;
import Android.widget.Toast;
import Java.util.ArrayList;
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
private LayoutInflater inflater;
public static ArrayList<Model> imageModelArrayList;
private Context ctx;
public CustomAdapter(Context ctx, ArrayList<Model> imageModelArrayList) {
inflater = LayoutInflater.from(ctx);
this.imageModelArrayList = imageModelArrayList;
this.ctx = ctx;
}
@Override
public CustomAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.rv_item, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final CustomAdapter.MyViewHolder holder, int position) {
holder.checkBox.setText("Checkbox " + position);
holder.checkBox.setChecked(imageModelArrayList.get(position).getSelected());
holder.tvAnimal.setText(imageModelArrayList.get(position).getAnimal());
// holder.checkBox.setTag(R.integer.btnplusview, convertView);
holder.checkBox.setTag(position);
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer pos = (Integer) holder.checkBox.getTag();
Toast.makeText(ctx, imageModelArrayList.get(pos).getAnimal() + " clicked!", Toast.LENGTH_SHORT).show();
if (imageModelArrayList.get(pos).getSelected()) {
imageModelArrayList.get(pos).setSelected(false);
} else {
imageModelArrayList.get(pos).setSelected(true);
}
}
});
}
@Override
public int getItemCount() {
return imageModelArrayList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
protected CheckBox checkBox;
private TextView tvAnimal;
public MyViewHolder(View itemView) {
super(itemView);
checkBox = (CheckBox) itemView.findViewById(R.id.cb);
tvAnimal = (TextView) itemView.findViewById(R.id.animal);
}
}
from @ninjahoahong ._. J'ajoute un écouteur de case à cocher dans la méthode onBindViewHolder et la case à cocher peut cliquer.
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = viewHolder.getAdapterPosition();
ChoiceItem currentItem = mChoice.get(pos);
if(viewHolder.checkBox.isChecked()){
onItemCheckListener.onItemCheck(currentItem);
currentItem.setCheck(true);
}else{
onItemCheckListener.onItemUncheck(currentItem);
currentItem.setCheck(false);
}
}
});
Ajoutez simplement deux méthodes de remplacement pour recyclerview
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
1) Vous pouvez ajouter mainHolder.imageview OnClickListener
2) En deux étapes:
Code:
mainHolder.imageview.setOnClickListener(new View.OnClickListener()
{
public void onClick (View v)
{
mainHolder.checkBox.setChecked(!mainHolder.checkBox.isChecked());
}
}
);
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
List list= aList.get(position);
//Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show();
action(list.getId());
}
@Override
public void onLongClick(View view, int position) {
}
}));