如何使所有复选框在gridimage的Longclick上可见

时间:2018-08-23 17:52:11

标签: android android-layout android-arrayadapter android-gridview

我想使图像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类本身中发生。 预先感谢!

2 个答案:

答案 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;
    }
});