Reputation: 2434
I'm making a multiple selection RecyclerView
in Android in order to delete the selected items.
Checkboxes are initially invisible, the main logic is when a single view is long clicked all checkboxes are visible.
I'm performing to long click in onBindViewHolder
and only the one clicked is visible.
Here is my adapter :
private Context mContext ;
private ArrayList<Picture> mData ;
private ArrayList<Picture> mDataFiltered;
public CoffretPicturesAdapter(Context mContext, ArrayList<Picture> mData) {
this.mContext = mContext;
this.mData = mData;
this.mDataFiltered = mData;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view ;
LayoutInflater mInflater = LayoutInflater.from(mContext);
view = mInflater.inflate(R.layout.cardview_item_coffret,parent,false);
return new MyViewHolder(view);
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mDataFiltered = mData;
} else {
ArrayList<Picture> filteredList = new ArrayList<>();
for (Picture row : mData) {
// name match condition. this might differ depending on your requirement
// here we are looking for name or phone number match
if (row.getTitle().toLowerCase().contains(charString.toLowerCase())) {
filteredList.add(row);
}
}
mDataFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mDataFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mDataFiltered = (ArrayList<Picture>) filterResults.values;
notifyDataSetChanged();
}
};
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.coffret_title.setText(mDataFiltered.get(position).getTitle());
Picasso.with(mContext).load(mDataFiltered.get(position).getUri()).placeholder(R.drawable.placeholder).resize(500,500).centerCrop().into(holder.coffret_thumbnail);
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "" + mDataFiltered.get(position).getTitle(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(mContext, SelectedPicPreviewActivity.class);
intent.putExtra("image_url", mDataFiltered.get(position).getUri().toString());
mContext.startActivity(intent);
}
});
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
holder.checkBox.setVisibility(View.VISIBLE);
return true;
}
});
}
@Override
public int getItemCount() {
return mDataFiltered.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView coffret_title;
ImageView coffret_thumbnail;
LinearLayout cardView ;
CircleCheckBox checkBox;
public MyViewHolder(View itemView) {
super(itemView);
coffret_title = (TextView) itemView.findViewById(R.id.coffret_title_id) ;
coffret_thumbnail = (ImageView) itemView.findViewById(R.id.coffret_img_id);
cardView = (LinearLayout) itemView.findViewById(R.id.cardview_id);
checkBox = (CircleCheckBox) itemView.findViewById(R.id.circle_check_box);
}
}
I wish you guys can help me find the problem and maybe tell me about the way adapter methods work.
Upvotes: 2
Views: 1240
Reputation: 604
I wish you create a boolean flag which will indicate visibility of all the checkboxes and call notifyDataSetChanged()
to rebind items:
private boolean mAreCheckboxesVisible = false;
// ...
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
// ...
holder.checkBox.setVisibility(mAreCheckboxesVisible ? View.VISIBLE : View.GONE);
holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
mAreCheckboxesVisible = true;
notifyDataSetChanged();
return true;
}
});
}
And if you want to escape selection mode:
mAreCheckboxesVisible = false;
notifyDataSetChanged();
Upvotes: 3