我想使图像checkbox
中所有不可见的longclick
可见。但是,这仅使一个复选框可见。
根据建议进行修改
在gridadapter类中。
public GridViewAdapter(Context context, int layoutResourceId,
ArrayList<ImageItem> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;//id of grid_item_layout
this.context = context;
this.imageFiles = imageFiles;
this.data = data;
}
public View getView(final int position, final View convertView, @NonNull ViewGroup parent) {
row = convertView;
final ViewHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
//find resource...
holder.image = (ImageView) row.findViewById(R.id.image);
holder.imageTitle = (TextView) row.findViewById(R.id.text);
holder.check = (CheckBox) row.findViewById(R.id.checkbox);
row.setTag(holder);
}
else
{ holder = (ViewHolder) row.getTag();}
holder.check.setOnCheckedChangeListener(null);
holder.check.setFocusable(false);
holder.image.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
holder.check.setVisibility(View.VISIBLE);
return true;
}
});
holder.check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (data.get(position).isSelected()) {
data.get(position).setSelected(false);
} else {
data.get(position).setSelected(true);
}
}
});
holder.check.setChecked(data.get(position).isSelected());
holder.imageTitle.setText(data.get(position).getTitle());
holder.image.setImageBitmap(data.get(position).getImage());
return row;
}
static class ViewHolder {
TextView imageTitle;
ImageView image;
CheckBox check;
}
我以前在mainactivity中确实使用过adapter
对象。
GridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
gridView.setAdapter(gridAdapter);
// gridView.OnLongclick....
for(int index=0;index< adapterView.getChildCount();index++) {
View nextchild = (adapterView.getChildAt(index));
CheckBox checkBox = (CheckBox) nextchild.findViewById(R.id.checkbox);
checkBox.setVisibility(View.VISIBLE);
}
现在,我希望所有事情都在adapter
类本身中发生。
预先感谢!
答案 0 :(得分:1)
您在适配器中使用的ViewHolder模式要求项目状态存在于数据本身中。直接在视图本身上进行操作(如在发布的示例中)将导致滚动时出现奇怪的状态问题。 ViewHolder.onBind()方法(或自定义等效项)需要能够根据数据元素正确设置是否选中复选框,因此应对getData()进行转换,以使每个项目都具有一个布尔isChecked字段。 / p>
或者,如果所有项目始终一起被选中或未选中,则您可能在Adapter中有一个布尔值字段,该字段可用于在需要时选中onBind()框。适配器中的方法可以更改布尔值,然后更改notifyDataSetChanged()以重新绑定所有内容。
如果我们可以看到更多的GridViewAdapter实现,可以提供更多详细信息。
答案 1 :(得分:0)
在您的适配器类中,采用本地布尔值,例如
boolean ischecked =false ;
在您的绑定方法中
holder.check.setVisibality(ischecked? View.VISIBLE:View.GONE);
holder.image.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
ischecked = true;
notifyDataSetChanged():
//holder.check.setVisibility(View.VISIBLE);
return true;
}
});