问题描述:
使用RecycleView实现长按删除功能时,当长按某个Item之后,将全局变量mIsCheckBoxShow
设为View.VISIBLE
,并调用adapter的notifyDataSetChanged()
方法,但是有的Item的checkBox能够显示,有的没有显示,格式混乱。
原因:
暂时不太清楚。。。
解决方案
重新设置checkBox
的Visibility
属性。
其他的样式混乱应该也可以这么解决,在OnBindViewHolder
中重新设置组件的属性。
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
...
// 防止显示错乱
holder.mCheckBox.setVisibility(mIsCheckBoxShow);
}
Adapter和Entity部分的代码如下:
public class PictureEntity {
// 文件路径 这个也多余
String mFilePath;
// 文件的bitmap,显示用,有点多余
Bitmap mBitmap;
// 文件,主要用来获取图片的详细信息的
File mFile;
}
public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.ViewHolder> {
public static ArrayList<PictureEntity> mPictureEntities = new ArrayList<>();
static ArrayList<Integer> sSelectedImage = new ArrayList<>();
Context mContext;
// 图片下面的checkbox的可见性。某个Item长按之后,这个值会被修改为View.VISIBLE
static int mIsCheckBoxShow = View.GONE;
// 构造方法传入Context,有用
public MyRecycleViewAdapter(ArrayList<PictureEntity> pictureEntities, Context context) {
mPictureEntities = pictureEntities;
mContext = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
PictureEntity bitmap = mPictureEntities.get(position);
holder.mImageView.setImageBitmap(bitmap.mBitmap);
// 防止显示错乱
holder.mCheckBox.setVisibility(mIsCheckBoxShow);
// imageView的点击事件
holder.mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, DetailActivity.class);
intent.putExtra("position", position);
mContext.startActivity(intent);
}
});
// imageView的长按事件
holder.mImageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// 修改mIsCheckBoxShow的值为View.VISIBLE,
// 所有的chebox都将可见
mIsCheckBoxShow = View.VISIBLE;
// notifyDataSetChanged
notifyDataSetChanged();
// 消费掉此事件
return true;
}
});
}
@Override
public int getItemCount() {
return mPictureEntities.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
// 图片
ImageView mImageView;
// 图片下面的checkbox
CheckBox mCheckBox;
public ViewHolder(View view) {
super(view);
mCheckBox = view.findViewById(R.id.delete_check_box);
mImageView = view.findViewById(R.id.image_view);
mCheckBox.setVisibility(mIsCheckBoxShow);
}
}
}