【问题标题】:How to delete multiple gridview items at once如何一次删除多个gridview项目
【发布时间】:2018-01-03 10:14:09
【问题描述】:

我创建了一个图片库应用,将图片显示为 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;

    }
}

【问题讨论】:

  • 你确定你使用的是CHOICE_MODE_MULTIPLE吗?
  • gridView.getCheckedItemPositions() 只返回选择选项。因此,如果您使用自定义适配器,请查看 This answer
  • 我可以在不使用 'CHOICE_MODE_MULTIPLE' 的情况下选择多个项目,但是当我单击删除按钮 @ADM 时我无法一次全部删除它们
  • GridViewAdapter 的邮政编码也
  • 完成@SanjayMajoka

标签: java android gridview delete-file image-gallery


【解决方案1】:

你可以这样做

活动中-

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

  }

现在调用适配器的方法,如删除 btn 点击 -

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

我希望它会有所帮助。

【讨论】:

    【解决方案2】:

    我认为这是因为您只从适配器中删除了一个位置。

    ... 
    public void onClick(DialogInterface dialog, int id) {
                                                    deleteSelectedItems();
                                                    al_images.remove(position);
                                                    adapter.notifyDataSetChanged();
    ...
    

    目前无法测试代码,但请尝试:

    private void deleteSelectedItems() {
            SparseBooleanArray checked = gridView.getCheckedItemPositions();
            if (checked != null) {
                List<Object> list = mSelected;
                for (int i = 0; i < checked.size(); i++) {
                    if (checked.valueAt(i)) {
                        mSelected.remove(checked.keyAt(i));
                        al_images.remove(checked.keyAt(i));
                    }
                }
            }
        }
    

    【讨论】:

    • 我更新了deleteSelectedItems() 函数,这样它也会从适配器中删除选中的位置。之前,您要从列表中删除所有选定的项目,但只从适配器中删除一项(位置)。
    • 我又更新了代码,你试试这个能不能用?
    【解决方案3】:

    选择并删除多个项目:

    1. 在您选择项目的那一刻,将该项目的位置或唯一值存储在数组或列表中。

    2. 选择项目后,当用户按下Delete 按钮时,循环遍历您的主要项目并从中删除所选项目。

    3. 调用notifyDataSetChanged();刷新适配器

      //基于项目位置
      List  selectedItems = new ArrayList  ();
      公共无效 onSelected(int pos){ selectedItems.add(pos); }
      公共删除项目(){ for (Integer pos = selectedItems) { mainItems.remove((int)pos); } 适配器.notifyDataSetChanged(); }

    【讨论】:

    • 我在第 2 步遇到问题,不知何故代码无法实现
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多