当前位置: 首页 > 知识库问答 >
问题:

在GridView Android中实现多重选择

衡子安
2023-03-14

我需要在GridView中选择多个图像,并在GridView中添加共享和删除按钮。

MyImageAdapter类别:

private class ImageAdapter extends BaseAdapter {

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ImageView imageView;
        CheckableLayout checkableLayout;

        if (convertView == null) {
            imageView = new ImageView(activity);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            checkableLayout = new CheckableLayout(activity);
            imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));
        } else {
            checkableLayout = (CheckableLayout) convertView;
            imageView = (ImageView) checkableLayout.getChildAt(0);
        }

        bitmap = decodeFile(getItem(position), imageWidth, imageWidth);
        imageView.setImageBitmap(bitmap);
        imageView.setOnClickListener(new OnImageClickListener(position));
        return imageView;

    }

    class OnImageClickListener implements View.OnClickListener {

        int position;

        public OnImageClickListener(int position) {
            this.position = position;
        }

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(activity, ImageDisplayActivity.class);
            intent.putExtra("id", getPosition(position));
            activity.startActivity(intent);
        }
    }

    public class CheckableLayout extends FrameLayout implements Checkable {

        private boolean mChecked;

        public CheckableLayout(Context context) {
            super(context);
        }

        @Override
        public void setChecked(boolean checked) {
            mChecked = checked;
            setBackgroundDrawable(checked ? getResources().getDrawable(R.drawable.blue) : null);
        }

        @Override
        public boolean isChecked() {
            return mChecked;
        }

        @Override
        public void toggle() {
            setChecked(!mChecked);
        }
    }

    public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener {

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            int selectCount = gridView.getCheckedItemCount();
            switch (selectCount) {
                case 1:
                    mode.setSubtitle("One item selected");
                    break;
                default:
                    mode.setSubtitle("" + selectCount + " items selected");
                    break;
            }
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.setTitle("Select Items");
            mode.setSubtitle("One item selected");
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return true;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

        }
    }
}

但是当我试图打开Gridview时,它给我一个错误。

我的Logcat细节

02-10 21:10:46.965 21658-21658/com.Android示例E/AndroidRuntime﹕ 致命异常:主进程:com.Android例如,PID:21658java。ClassCastException:android。小装置。无法将ImageView强制转换为com.Android实例GridViewActivity$CheckableLayout位于com.Android实例GridViewActivity$ImageAdapter。android上的getView(GridViewActivity.java:224)。小装置。AblistView。android上的获取视图(AbsListView.java:2255)。小装置。GridView。android上的onMeasure(GridView.java:1044)。看法看法在android上测量(View.java:16540)。小装置。相对论。android上的measureChild(RelativeLayout.java:689)。小装置。相对论。android上的onMeasure(RelativeLayout.java:473)。看法看法在android上测量(View.java:16540)。支持v4。小装置。抽屉布局。android上的onMeasure(DroperLayout.java:851)。看法看法在android上测量(View.java:16540)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:5137)。小装置。框架布局。android上的onMeasure(FrameLayout.java:310)。看法看法在android上测量(View.java:16540)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:5137)。小装置。线性布局。android上的measureChildBeforeLayout(LinearLayout.java:1404)。小装置。线性布局。android上的measureVertical(LinearLayout.java:695)。小装置。线性布局。android上的onMeasure(LinearLayout.java:588)。看法看法在android上测量(View.java:16540)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:5137)。小装置。框架布局。android上的onMeasure(FrameLayout.java:310)。看法看法在android上测量(View.java:16540)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:5137)。小装置。线性布局。android上的measureChildBeforeLayout(LinearLayout.java:1404)。小装置。线性布局。android上的measureVertical(LinearLayout.java:695)。小装置。线性布局。android上的onMeasure(LinearLayout.java:588)。看法看法在android上测量(View.java:16540)。看法视图组。android上的measureChildWithMargins(ViewGroup.java:5137)。小装置。框架布局。com上的onMeasure(FrameLayout.java:310)。Android内部的政策impl。电话窗口$DecorView。android上的onMeasure(PhoneWindow.java:2291)。看法看法在android上测量(View.java:16540)。看法ViewRootImpl。android上的performMeasure(ViewRootImpl.java:1942)。看法ViewRootImpl。android上的measureHierarchy(ViewRootImpl.java:1132)。看法ViewRootImpl。android上的performTraversals(ViewRootImpl.java:1321)。看法ViewRootImpl。android上的doTraversal(ViewRootImpl.java:1019)。看法ViewRootImpl$TraversalRunnable。在android上运行(ViewRootImpl.java:5725)。看法编舞$CallbackRecord。在android上运行(Choreographer.java:761)。看法编舞android上的doCallbacks(Choreographer.java:574)。看法编舞android上的doFrame(Choreographer.java:544)。看法Choreographer$FrameDisplayEventReceiver。在android上运行(Choreographer.java:747)。操作系统。处理程序。android上的handleCallback(Handler.java:733)。操作系统。处理程序。android上的dispatchMessage(Handler.java:95)。操作系统。活套。android上的loop(Looper.java:136)。应用程序。活动线程。java上的main(ActivityThread.java:5086)。朗。反思。方法在com上调用(本机方法)。Android内部的操作系统。ZygoteInit$MethodandArgscaler。在com上运行(ZygoteInit.java:785)。Android内部的操作系统。合子体。main(ZygoteInit.java:601)

共有2个答案

寇开畅
2023-03-14

android.widget.ImageView不能转换为com.android.example.GridViewActive$CheckableLayout

因为您正在从getView返回ImageView,但试图将其转换为此行中的CheckableLayout

checkableLayout = (CheckableLayout) convertView;

getView()方法返回checkableLayout

        @Override
        public View getView(final int position, 
                            View convertView, ViewGroup parent) {
            final ImageView imageView;
            CheckableLayout checkableLayout;

            if (convertView == null) {
                imageView = new ImageView(activity); 
                // your code here ... 
                // add ImageView to checkableLayout
                checkableLayout.addView(imageView); 

            } else 
               checkableLayout = (CheckableLayout) convertView;
               imageView = (ImageView) checkableLayout.getChildAt(0);
               // your code here ... 
              return checkableLayout;

   }
林礼骞
2023-03-14

您应该从getView方法返回convertView

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

    // code here

    convertview.addView(checkableLayout);
    return convertView;

}
 类似资料:
  • 本文向大家介绍el-select 下拉框多选实现全选的实现,包括了el-select 下拉框多选实现全选的实现的使用技巧和注意事项,需要的朋友参考一下 在写一个功能时发现el-select支持多选,但是竟然不支持全选,好无语哦,那就自己实现一下吧~有两种方法,第二种感觉简单些 方法一:下拉项增加一个【全选】,然后应该有以下几种情况: 下拉选项全都勾选时,【全选】自动勾选; 下拉选项部分勾选时,点击

  • 本文向大家介绍Vue实现多标签选择器,包括了Vue实现多标签选择器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Vue实现多标签选择器展示的具体代码,供大家参考,具体内容如下 实现效果 实现代码 标签筛选的数据格式 data.js 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍vue实现单选和多选功能,包括了vue实现单选和多选功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了vue实现单选和多选功能的具体代码,供大家参考,具体内容如下复制代码 vue实现多选功能 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我先用代码。我正在尝试在Asp中实现多对多关系。具有的net core。净额6。 我的订单型号: 我的产品型号: 当我尝试更新数据库时,出现以下错误:

  • 1.在移动目标和来源在同一分区(如都在C盘)是可以用 Rename语句 和 执行命令行Move 实现: OutFile "Test.EXE" Name "Test" Section Rename "C:\Program Files\Test.txt" "C:\Test.txt" SectionEnd 2.在不同分区可以使用命令行的Move命令: OutFile "Test.EXE" Name "