如何在gridimage的Longclick上显示所有复选框

问题描述 投票:2回答:2

我想通过图像的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类本身。提前致谢!

android android-layout android-arrayadapter android-gridview
2个回答
1
投票

您在适配器中使用的ViewHolder模式要求项目状态存在于数据本身中;直接在视图上操作(如在发布的示例中)将在滚动时导致奇怪的状态问题。 ViewHolder.onBind()方法(或自定义等效方法)需要能够根据数据元素正确设置是否选中复选框,因此应转换getData(),使每个项都有一个布尔isChecked字段。

或者,如果所有项目始终一起被选中或取消选中,则可能在适配器中有一个布尔字段,可用于在需要时选中onBind()框。适配器中的方法可以更改布尔值,然后notifyDataSetChanged()重新绑定所有内容。

如果我们可以看到更多的GridViewAdapter实现,可以提供更多细节。


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;
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.