Изменить видимость всех флажков в классе адаптера gridview - PullRequest
0 голосов
/ 25 августа 2018

Я хочу сделать все невидимые флажки видимыми при длинном щелчке изображения.Но это делает видимым только один флажок.

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

}

Используется для поддержания состояния флажка.Ранее я изменил видимость в mainacctivity следующим образом:

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

Но я столкнулся с некоторыми другими проблемами в этом методе, поэтому хочу изменить состояние флажка в самом классе адаптера.Я ударил по этому в течение двух недель.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 25 августа 2018

Из этого утверждения в вашем адаптере:

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

Идея состоит в том, чтобы обновить саму модель, а затем вызвать обновление списка.

Обновлено
Хорошо, основываясь на ваших комментариях, позвольте мне попытаться объяснить еще раз:

Так что в настоящее время у вас есть этот кусок кода, чтобы включить все флажки:

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.
...