java - 如何一次删除多个gridview项目

标签 java android gridview delete-file image-gallery

我创建了一个图像库应用程序,它将图像显示为 GridView 。我可以一次选择多张照片,但无法通过单击删除按钮一次性删除所有照片。 我没有使用复选框,因为它与我的应用程序的设计不相符。我尝试找到一种方法,但几乎所有人都使用复选框。任何人都可以建议我如何一次删除多张照片不使用复选框?

PhotosActivity.java:

public class PhotosActivity extends AppCompatActivity {
    int int_position;
    private GridView gridView;
    GridViewAdapter adapter;
    ArrayList<Model_images> al_menu = new ArrayList<>();
    private ArrayList<Object> mSelected = new ArrayList<>();
    boolean boolean_folder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_gallery);

        final ImageButton button1 = (ImageButton) findViewById(R.id.button1);
        final ImageButton button2 = (ImageButton) findViewById(R.id.button2);
        final ImageButton button3 = (ImageButton) findViewById(R.id.button3);
        final ImageButton button4 = (ImageButton) findViewById(R.id.button4);
        final ImageButton button5 = (ImageButton) findViewById(R.id.button5);
        button1.setVisibility(View.GONE);
        button2.setVisibility(View.GONE);
        button3.setVisibility(View.GONE);
        button4.setVisibility(View.GONE);
        button5.setVisibility(View.GONE);

        gridView = (GridView) findViewById(android.R.id.list);
        int_position = getIntent().getIntExtra("value", 0);
        adapter = new GridViewAdapter(this, al_images, int_position);
        gridView.setAdapter(adapter);
        gridView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String abc = "file://" + al_images.get(int_position).getAl_imagepath().get(position);

                Intent i = new Intent(getApplicationContext(), FullImageActivity.class);
                i.putExtra("id", position);
                i.putExtra("folderPosition", int_position);
                i.putExtra("abc", abc);
                startActivity(i);
            }
        });

        gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
                String position1 = new String(al_images.get(int_position).getAl_imagepath().get(position));
                if(mSelected.contains(position1)) {
                    mSelected.remove(position1);
                    view.setBackgroundColor(Color.TRANSPARENT);// remove item from list
                    // update view (v) state here
                    // eg: remove highlight
                }
                else {
                    mSelected.add(position1);
                    view.setBackgroundColor(Color.LTGRAY);// add item to list
                    // update view (v) state here
                    // eg: add highlight
                }


                button1.setVisibility(View.VISIBLE);
                button2.setVisibility(View.VISIBLE);
                button3.setVisibility(View.VISIBLE);
                button4.setVisibility(View.VISIBLE);
                button5.setVisibility(View.VISIBLE);
                button3.setOnClickListener(
                        new View.OnClickListener() {
                            public void onClick(View view) {
                                AlertDialog.Builder builder1 = new AlertDialog.Builder(PhotosActivity.this);
                                builder1.setMessage("Are you sure you want to delete it ?");
                                builder1.setCancelable(true);

                                builder1.setPositiveButton(
                                        "Yes",
                                        new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int id) {
                                                deleteSelectedItems();
                                                al_images.remove(position);
                                                adapter.notifyDataSetChanged();
                                                finish();
                                            }
                                        });

                                builder1.setNegativeButton(
                                        "No",
                                        new DialogInterface.OnClickListener() {
                                            public void onClick(DialogInterface dialog, int id) {
                                                dialog.cancel();
                                            }
                                        });

                                AlertDialog alert11 = builder1.create();
                                alert11.show();
                            }
                        });

                return true;
            }
        });
    }
    private void deleteSelectedItems() {
        SparseBooleanArray checked = gridView.getCheckedItemPositions();
        if (checked != null) {
            List<Object> list = mSelected;
            for (int i = 0; i < checked.size(); i++) {
                if (checked.get(i)) {
                    Object item = list.get(i);
                    mSelected.remove(item);
                    checked.delete(i);
                }
            }
        }
    }

GridviewAdapter.java

public class GridViewAdapter extends ArrayAdapter<Model_images> {

    Context context;
    ViewHolder viewHolder;
    ArrayList<Model_images> al_menu = new ArrayList<>();
    int int_position;

    public GridViewAdapter(Context context, ArrayList<Model_images> al_menu,int position) {
        super(context, R.layout.activity_adapter__photos_folder, al_menu);
        this.al_menu = al_menu;
        this.context = context;
        this.int_position = position;
    }

    @Override
    public int getCount() {
        Log.e("ADAPTER LIST SIZE", al_menu.size() + "");
        Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + "");
        return al_menu.get(int_position).getAl_imagepath().size();
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount() {
        if (al_menu.size() > 0) {
            return al_menu.get(int_position).getAl_imagepath().size();
        } else {
            return 1;
        }
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        if (convertView == null) {

            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_adapter__photos_folder, parent, false);
            viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder);
            viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2);
            viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.tv_foldern.setVisibility(View.GONE);
        viewHolder.tv_foldersize.setVisibility(View.GONE);


        Glide.with(context).load("file://" + al_menu.get(int_position).getAl_imagepath().get(position))
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true)
                .into(viewHolder.iv_image);


        return convertView;

    }

    private static class ViewHolder {
        TextView tv_foldern, tv_foldersize;
        ImageView iv_image;

    }
}

最佳答案

你可以这样做

Activity 中 -

  public class PhotosActivity extends AppCompatActivity {
    ...
    private ArrayList<Integer> mSelected = new ArrayList<>();
    ...
    gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
                    if(mSelected.contains(position)) {
                        mSelected.remove(position);
                        view.setBackgroundColor(Color.TRANSPARENT);// remove item from list
                        // update view (v) state here
                        // eg: remove highlight
                    }
                    else {
                        mSelected.add(position);
                        view.setBackgroundColor(Color.LTGRAY);// add item to list
                        // update view (v) state here
                        // eg: add highlight
                  }
                  .....
                  .....
                  .....

  }

现在调用适配器的方法,就像单击删除按钮一样 -

adapter.updateUpdapter(mSelecected);

在适配器中 -

 public GridViewAdapter(Context context, ArrayList<Model_images> al_menu,int position) {
        super(context, R.layout.activity_adapter__photos_folder, al_menu);
        this.al_menu.addAll(al_menu);
       ....
    }

private void updateUpdapter(ArrayList<Integer> mSelected){
        for(int selected: mSelected){
            al_menu.get(int_position).getAl_imagepath().remove(selected);
        }
        notifiDataSetChanged();
    }

希望对您有所帮助。

关于java - 如何一次删除多个gridview项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48075320/

相关文章:

java - 如何从批处理文件中暂停 Java 启动屏幕?

Java 改变对话框的标题

android - 在 list 上声明接收器和服务

java - 动态获取样式属性

Android以编程方式创建选择器

java - 从字节[]转换为文件(十六进制值)时出错

Java - 将unicode撇号分配给char

c# - 从 GridView C# 中的 DataRow 获取原始对象

gridview - 响应式 Gridview 列标题

android - 从 Android 中的 GridLayout 和 EditBox 中删除默认焦点颜色