zoukankan      html  css  js  c++  java
  • 为何AlertDialog中设置OnItemClick事件无反应

    很久没更新了,没想到我是遇到了一个大坑后才来更新的。我最近在做个人项目,遇到了一个小问题。真是被坑了。就是关于Dialog中的Onclick事件监听问题

    先贴一下源代码

     DialogPlus dialog = DialogPlus.newDialog(this)
                    .setAdapter(new PickPhotoDialogAdapter(this))
                    .setCancelable(true)
                    .setContentHolder(new GridHolder(3))
                    .setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(DialogPlus dialog, Object item, View view, int position) {
                            switch (position){
                                case 0:
                                    Intent intent = new Intent(Intent.ACTION_PICK);
                                    intent.setType("image/*");//相片类型
                                    startActivityForResult(intent, 199);
                                    break;
                                case 1:
                                    break;
                                case 2:
                                    break;
                            }
                            Toast.makeText(AddContactActivity.this,"test",Toast.LENGTH_LONG).show();
                        }
                    })
                    .create();
            dialog.show();
    

      我这里使用的Github上的一个开源项目DialogPlus,这与你是否使用系统自带的AlertDialog无关,因为问题不在这里。

    再看看我的适配器吧,关键就在于适配器中。

    public class PickPhotoDialogAdapter extends BaseAdapter{
        private Context mContext;
        public PickPhotoDialogAdapter(Context context) {
            mContext=context;
        }
    
        @Override
        public int getCount() {
            return 3;
        }
    
        @Override
        public Object getItem(int position) {
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            View view=convertView;
            if (view==null){
                view = View.inflate(mContext, R.layout.item_pickphoto_dialog, null);
                holder=new ViewHolder();
                holder.textView = (TextView) view.findViewById(R.id.tv_pickphoto);
                holder.imageButton = (ImageButton) view.findViewById(R.id.ib_pickphoto);//坑在此
                view.setTag(holder);
            }else {
                holder = (ViewHolder) view.getTag();
            }
            switch (position) {
                case 0:
                    holder.textView.setText("图库");
                    holder.imageButton.setImageResource(R.drawable.ic_photo_album_cyan_500_48dp);
                    break;
                case 1:
                    holder.textView.setText("拍照");
                    holder.imageButton.setImageResource(R.drawable.ic_camera_light_blue_500_48dp);
                    break;
                case 2:
                    holder.textView.setText("推荐头像");
                    holder.imageButton.setImageResource(R.drawable.ic_favorite_red_500_48dp);
                    break;
            }
    
    
            return view;
        }
    
        class ViewHolder {
            TextView textView;
            ImageButton imageButton;//坑在这里
        }
    
    }
    

      上面我也写了,坑在此。运行结果弹出了对话框,然而,点击事件没有反应。网上查了很多资料,说什么设置Onclick要写包名加类名,但不是我们这个问题的解决方法。

    我们的问题是出在于ImageButton这个控件,因为在Item中如果有Button,CheckBox等控件的话,系统默认的会把焦点给到这些子控件,所以OnItemClick事件没有受理。

    所以,我们可以通过将Item中包含的Button,CheckBox等控件的focusable属性设置为false,如此一来Item就自动获得了Focus焦点的权限,也就可以被选中了,同时也会响应onItemClickListener中的onItemClick()方法。
    解决办法:(以下两种办法任意一种都可)
    1.将Item中包含的Button,CheckBox等控件的focusable属性设置为false
    2.将ImageButton换为ImageView(我就是采用了这个方法,当初手贱写成了ImageButton)
    好了,继续写项目去。
  • 相关阅读:
    Centos7 安装Postgres11(更改数据目录)
    将trj保存成.gpx文件方便进行地图匹配(来自徐博士的支援)
    将北京路网OSM文件导入到PostgreSQL + PostGIS 中,并利用osm2pgrouting工具+osmosis工具构建路网Graph拓扑结构
    SQL-时间-UTC-时间戳-日期-年查询在PG+PostGIS
    地理坐标系4326--投影坐标系3857/2436
    基于postgis时空查询-记录而已
    Java 接口
    单例模式
    weblogic启动一闪而过
    oracle存储过程中is和as区别
  • 原文地址:https://www.cnblogs.com/linchaohao/p/5496139.html
Copyright © 2011-2022 走看看