【问题标题】:Change the visibility of all checkbox in gridview adapter class更改 gridview 适配器类中所有复选框的可见性
【发布时间】:2018-08-27 19:55:43
【问题描述】:

我想通过长按图像使所有不可见的复选框可见。但这只会使一个复选框可见。

   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;
}

我的 ImageItem 类

public class ImageItem {
    private Bitmap image;
    private boolean selected;
    private String title;

    public ImageItem(Bitmap image, String title) {
        super();
        this.image = image;
        this.title = title;
    }

    public Bitmap getImage() {
        return image;
    }

    public void setImage(Bitmap image) {
        this.image = image;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }


    public void setSelected(boolean selected) {
        this.selected = selected;
    }
    public boolean isSelected() {
        return selected;
    }

}

这用于维护复选框的状态。 我之前将 mainactivity 中的可见性更改如下

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

但是我在这个方法中遇到了一些其他的问题,所以想改变适配器类本身的复选框状态。我对此持续了两个星期。任何帮助表示赞赏。

【问题讨论】:

    标签: java android android-layout android-arrayadapter android-checkbox


    【解决方案1】:

    来自适配器中的此语句:

    holder.check.setChecked(data.get(position).isSelected())
    

    看起来ImageItem 已经在selected 成员字段中维护了复选框的状态。如果是这样,那么您可以遍历ImageData 列表并稍后通知适配器数据已更改,而不是遍历列表中的实际视图并切换每个复选框的可见性。

    类似这样的:

    List<ImageItem> list = // ...
    
    // Mark everything as selected
    for(ImageItem item : list){
        item.setSelected(true);
    }
    
    // Refresh the list
    gridAdapter.notifyDataSetChanged();
    

    想法是更新模型本身,然后触发列表的更新。

    更新
    好的,根据你的cmets让我再解释一下:

    所以目前你有这段代码可以打开所有的复选框:

    GridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
    gridView.setAdapter(gridAdapter);
    
    // gridView.OnLongclick....
    for(int index=0;index< adapterView.getChildCount();index++) {
         // ....
    }
    

    我的建议如下:

    // Get the data and store it in a local copy
    List<ImageItem> items = getData();
    
    // Mark each item in the list as selected
    for(ItemItem item : items){
        item.setSelected(true);
    }
    
    // Pass the updated list to the adapter
    GridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, items);
    gridView.setAdapter(gridAdapter);
    
    // Assuming that your adapter is properly implemented, 
    // all checkboxes should be marked as selected now.
    

    【讨论】:

    • 非常感谢。但是,如果您可以扩展一点,那将是一个很大的帮助,我不确定在哪里添加它。如何让他们被选中,改变知名度?我是初学者。
    • 请扩展您的答案
    • 我已经更新了我的答案,希望它能让你更清楚你需要做什么。
    • 我知道了,Andy res,这可以立即更改所有复选框的可见性,但最初它是不可见的,我的问题是让所有复选框可见。
    • 我不明白...为什么最初不能应用相同的逻辑?
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多