Reputation: 962
I have populated the recyclerView with image, title and checkbox. I have two problems.
How to make the checkbox selected when the imageview or the whole recycler item is clicked.
I have to go to next activity by getting all the checked items from the recyclerview.
My layout :
<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>
My adapter:
@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();
}
});
}
Upvotes: 27
Views: 53424
Reputation: 2664
One simple solution is to create OnItemCheckLister
, and implement it similar to following:
public class MyAdapter extends RecyclerViewAdapter {
interface OnItemCheckListener {
void onItemCheck(Item item);
void onItemUncheck(Item item);
}
...
@NonNull
private OnItemCheckListener onItemClick;
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);
}
}
}
Then in the activity, we can do this:
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);
}
});
Then you can do stuff with currentSelectedItems
.
Note: Since this solution suppose for the whole Item to be pressed so the checkbox is set to be not clickable.
Upvotes: 64
Reputation: 284
first set a boolean value in moodel class
and clicking of checkbox pass boolean true
and checked all check box is clicked or not by following method
fun isListContainMethod(arraylist: List<Puzzle>): Boolean {
for (puzzle in arraylist) {
if (!puzzle.isSelect) {
return false
}
}
return true
}
Upvotes: 3
Reputation: 456
This work for me and will work for you as well Just Create Static List, I created it on MainActivity.java
public static List<String> myItems = new ArrayList<>();
Create setOnCheckedChangeListener in YouAdapter.class
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b){
myItems.add(Model.getYouItem());
}
else{
myItems.remove(Model.getYouItem());
}
}
});
Now you can use your myItems list to perform operations.
Upvotes: 1
Reputation: 289
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) {
}
}));
Upvotes: 0
Reputation: 13
from @ninjahoahong I add checkbox listenner in onBindViewHolder method and checkbox can click able.
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);
}
}
});
Upvotes: 0
Reputation: 41
1) You can add mainHolder.imageview OnClickListener
2) Two step:
Code:
mainHolder.imageview.setOnClickListener(new View.OnClickListener()
{
public void onClick (View v)
{
mainHolder.checkBox.setChecked(!mainHolder.checkBox.isChecked());
}
});
Upvotes: 0
Reputation: 483
You can use Model class to get recyclerView checked items. More reference : Android Recyclerview checkbox
Model
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;
}
}
Adapter
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);
}
}
Upvotes: 5