GridView中item点击事件思考

update 2015/04/06

=====

touch_down-----longclick------touch_up------click

=====

功能:【长按开始录音,松开录音完成】+点击

click====down+up

longclick====down+Time

【code】

isLong = false

onTouch {

if(isLong) {

do;

isLong = false;

};

return false;

}

onLongClick{

isLong = true;

return true;

}

onClick{


}

【点击,由于touch中return false,则点击】

【长按开始录音,松开录音完成】,开始是down,进入touch函数,return false,进入long函数,return true,遇到true则响应结束。但是一直还没有up,当up,则进入touch函数,因为click和long都是需要touch,则不响应其。

http://blog.csdn.net/huanghuanghbc/article/details/8634891


功能:长按后touch_down录音touch_up录音完成+点击

GridView中item的布局有:ImagView、TextView

效果:

GridView中点击每个item进行对应地图刷新

GridView中长按每个item进入使该item进入Touch模式:touch-down录音、touch-up发送录音到服务器

尝试1:Adapter中的view始终抢占gridview的focus

GridView.Adapter中getView对ImagView.setOnTouchListener

GridView.setOnItemClickListener地图刷新

GridView.setOnItemLongClickListener录音处理并设定imageview的focus、click

一定要注意,不管是Button,还是TextView,只要设置了onClick() 的话,那么OnItemClick()就不会被执行

android:descendantFocusability="blocksDescendants"

http://www.cnblogs.com/zgz345/archive/2012/07/05/2578110.html

尝试2:勉强达到预期的效果

GridView.setOnItemClickListener地图刷新并兼有iamgeview的click设置

GridView.setOnItemLongClickListener录音处理并设定imageview的focus、click特征值

在gridview的click中嵌套imageview的click,首次总是gridview的响应

http://www.oschina.net/question/616446_66439

其他看到的:我也遇到过这个问题。在gridview的onitemclick事件触发的时候。循环获取adapterview的父节点。直到父节点是listview的时候。再调用listview的performitemclick。只想到这种方法。楼主有更好方法分享下哈

尝试3:特征值设置

http://aokunsang.iteye.com/blog/1668902

   看到小米手机和其他一些图片显示软件,gridview显示图片时候,长按某个item,可以进入编辑模式,试着也做了个。 

 

  在Android拍照、预览、上传综合的基础上改进,实现效果,长按gridview一个item图片显示,进入编辑模式,可以批量删除图片。两个需要注意的地方:

   1、选中图片的边框效果。  

      实现方法:设置背景图片为将要显示的图片,然后设置图片源setImageResource为带2像素边框的透明小图片。

   2、图片右上角给个小对号图片,标示选中。    

      实现方法:使用相对布局是这个小图片放在右上角。

 

 

   总结:网上也没有找到一个得劲的实现方式,我做这个后来发现有些瑕疵,本来可以做的更好,如:需要在java代码中控制gridview的全屏以及上下隔出间距显示按钮等其他元素(因为我使用的是Framelayout,各个元素是重叠的,设置显示为gone也没用);如果使用Linearlayout应该可以做到不用java代码设置间距。

 

效果图如下:


 

 



   

 这个没有demo,我把需要的图片,样式给放出来,关键地方有注释说明,源码如下:

【1】、图片展示类gridview

  /**

Java代码   收藏代码
  1.  * 图片预览  
  2.  * @author: aokunsang  
  3.  * @date: 2012-8-1  
  4.  */  
  5. public class PictureScanAct extends Activity {  
  6.   
  7.     private GridView gridView;  
  8.     private ImageAdapter imgAdapter;  
  9.       
  10.     private TextView seclectNumView;  
  11.     private Button deleteButton;  
  12.       
  13.     private List<LoadImage> fileNameList = new ArrayList<LoadImage>();     //保存Adapter中显示的图片详情(要跟adapter里面的List要对应)  
  14.     private List<LoadImage> selectFileLs = new ArrayList<LoadImage>();      //保存选中的图片信息  
  15.       
  16.     private boolean isDbClick = false;   //是否正在长按状态  
  17.       
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.           
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.picturescan);  
  23.           
  24.         gridView = (GridView)findViewById(R.id.picture_grid);  
  25.         seclectNumView = (TextView)findViewById(R.id.pic_seclet_num);  
  26.         deleteButton = (Button)findViewById(R.id.pic_delete);  
  27.         deleteButton.setOnClickListener(delClickListener);  
  28.           
  29.         imgAdapter = new ImageAdapter(this);  
  30.         gridView.setAdapter(imgAdapter);  
  31.         gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  32.             @Override  
  33.             public void onItemClick(AdapterView<?> parent, View view,  
  34.                     int position, long id) {  
  35.                 LoadImage loadimg = fileNameList.get(position);  
  36.                 ViewHolder holder = (ViewHolder)view.getTag();  
  37.                 if(isDbClick){  
  38.                     if(selectFileLs.contains(loadimg)){  
  39.                         holder.image1.setImageDrawable(null);   
  40.                         holder.image2.setVisibility(View.GONE);  
  41.                         imgAdapter.delNumber(position+"");  
  42.                         selectFileLs.remove(loadimg);  
  43.                     }else{  
  44.                         holder.image1.setImageResource(R.drawable.border);    //添加图片(带边框的透明图片)[主要目的就是让该图片带边框]  
  45.                         holder.image2.setVisibility(View.VISIBLE);  //设置图片右上角的对号显示  
  46.                         imgAdapter.addNumber(position+"");    //把该图片添加到adapter的选中状态,防止滚动后就没有在选中状态了。  
  47.                         selectFileLs.add(loadimg);  
  48.                     }  
  49.                     seclectNumView.setText("选中"+selectFileLs.size()+"张图片");  
  50.                 }else{  
  51.                     startActivity(new Intent(PictureScanAct.this, PictureViewAct.class).putExtra("flag","upload").putExtra("imagePath",loadimg.getFileName()));  
  52.                 }  
  53.             }  
  54.         });  
  55.         gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {  
  56.             @Override  
  57.             public boolean onItemLongClick(AdapterView<?> parent, View view,  
  58.                     int position, long id) {  
  59.                 LoadImage loadimg = fileNameList.get(position);  
  60.                 ViewHolder holder = (ViewHolder)view.getTag();  
  61.                 if(!isDbClick){  
  62.                     isDbClick = true;  
  63.                     gridView.setPadding(050050);            //长按后,让gridview上下都分出点空间,显示删除按钮之类的。看效果图就知道了。  
  64.                     seclectNumView.setVisibility(View.VISIBLE);  
  65.                     deleteButton.setVisibility(View.VISIBLE);  
  66.                     holder.image1.setImageResource(R.drawable.border);  
  67.                     holder.image2.setVisibility(View.VISIBLE);  
  68.                     imgAdapter.addNumber(position+"");  
  69.                     selectFileLs.add(loadimg);  
  70.                     seclectNumView.setText("选中1张图片");  
  71.                     return true;  
  72.                 }  
  73.                 return false;  
  74.             }  
  75.         });  
  76.         Toast.makeText(this"加载图片中....", Toast.LENGTH_SHORT).show();  
  77.         new AsyncLoadedImage().execute();  
  78.     }  
  79.     /** 
  80.      * 删除监听器事件 
  81.      */  
  82.     private android.view.View.OnClickListener delClickListener = new View.OnClickListener() {  
  83.         @Override  
  84.         public void onClick(View v) {  
  85.             if(selectFileLs.isEmpty()) {  
  86.                 Toast.makeText(PictureScanAct.this"请选择图片", Toast.LENGTH_SHORT).show();  
  87.                 return ;  
  88.             }  
  89.             for(LoadImage loadimg : selectFileLs){  
  90.                 File file = new File(loadimg.getFileName());  
  91.                 boolean isTrue = file.delete();  
  92.                 Log.i("----------------------删除图片------", isTrue+"---------------");  
  93.             }  
  94.             imgAdapter.deletePhoto(selectFileLs);  
  95.             seclectNumView.setText("选中0张图片");  
  96.         }     
  97.     };  
  98.       
  99.     @Override  
  100.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  101.         if(isDbClick && keyCode == KeyEvent.KEYCODE_BACK){    //点击返回按键  
  102.             isDbClick = false;  
  103.             gridView.setPadding(0000);            //退出编辑转台时候,使gridview全屏显示  
  104.             seclectNumView.setVisibility(View.GONE);  
  105.             deleteButton.setVisibility(View.GONE);  
  106.             selectFileLs.clear();  
  107.             imgAdapter.clear();  
  108.             return false;  
  109.         }  
  110.         return super.onKeyDown(keyCode, event);  
  111.     }  
  112.     /** 
  113.      * 异步加载图片展示 
  114.      * @author: aokunsang 
  115.      * @date: 2012-8-1 
  116.      */  
  117.     class AsyncLoadedImage extends AsyncTask<Object, LoadImage, Boolean> {  
  118.   
  119.         @Override  
  120.         protected Boolean doInBackground(Object... params) {  
  121.             File fileDir = new File(Const.imgPath);  
  122.             File[] files = fileDir.listFiles();  
  123.             boolean result = false;  
  124.             if(files!=null){  
  125.                 for(File file:files){  
  126.                     String fileName = file.getName();  
  127.                     if (fileName.lastIndexOf(".") > 0    
  128.                             && fileName.substring(fileName.lastIndexOf(".") + 1,    
  129.                             fileName.length()).equals("jpg")){  
  130.                         Bitmap bitmap;  
  131.                         Bitmap newBitmap;  
  132.                          try {  
  133.                             BitmapFactory.Options options = new BitmapFactory.Options();  
  134.                             options.inSampleSize = 10;  
  135.                             bitmap = BitmapFactory.decodeFile(file.getPath(), options);  
  136.                             newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 6770);  
  137.                             bitmap.recycle();  
  138.                             if (newBitmap != null) {  
  139.                                 LoadImage loadImage = new LoadImage(file.getPath(),newBitmap);  
  140.                                 fileNameList.add(loadImage);  
  141.                                 publishProgress(loadImage);  
  142.                                 result = true;  
  143.                             }  
  144.                         } catch (Exception e) {  
  145.                             e.printStackTrace();  
  146.                         }  
  147.                     }  
  148.                 }  
  149.             }  
  150.             return result;  
  151.         }  
  152.         @Override  
  153.         public void onProgressUpdate(LoadImage... value) {  
  154.             for(LoadImage loadImage:value){  
  155.                 imgAdapter.addPhoto(loadImage);  
  156.             }  
  157.         }  
  158.         @Override  
  159.         protected void onPostExecute(Boolean result) {  
  160.             if(!result){  
  161.                 showDialog(1);  
  162.             }  
  163.         }  
  164.      }  
  165.      @Override  
  166.     protected Dialog onCreateDialog(int id) {  
  167.          AlertDialog dialog = new AlertDialog.Builder(PictureScanAct.this).setTitle("温馨提示").setMessage("暂时还没有照片,请先采集照片!")  
  168.             .setPositiveButton("确定"new DialogInterface.OnClickListener(){  
  169.                 @Override  
  170.                 public void onClick(DialogInterface dialog, int which) {  
  171.                     startActivity(new Intent(PictureScanAct.this,TakePhotoAct.class));  
  172.                 }  
  173.             }).setNegativeButton("取消"new DialogInterface.OnClickListener() {  
  174.                 @Override  
  175.                 public void onClick(DialogInterface dialog, int which) {  
  176.                     finish();  
  177.                 }  
  178.             }).show();  
  179.          return dialog;  
  180.     }  
  181.        
  182.      /** 
  183.       * 图片详细信息bean 
  184.       * @author: aokunsang 
  185.       * @date: 2012-8-31 
  186.       */  
  187.     public class LoadImage {  
  188.            
  189.          private String fileName;  
  190.          private Bitmap bitmap;  
  191.            
  192.         public LoadImage() {  
  193.             super();  
  194.             // TODO Auto-generated constructor stub  
  195.         }  
  196.         public LoadImage(String fileName, Bitmap bitmap) {  
  197.             super();  
  198.             this.fileName = fileName;  
  199.             this.bitmap = bitmap;  
  200.         }  
  201.         /** 
  202.          * @return the fileName 
  203.          */  
  204.         public String getFileName() {  
  205.             return fileName;  
  206.         }  
  207.         /** 
  208.          * @param fileName the fileName to set 
  209.          */  
  210.         public void setFileName(String fileName) {  
  211.             this.fileName = fileName;  
  212.         }  
  213.         /** 
  214.          * @return the bitmap 
  215.          */  
  216.         public Bitmap getBitmap() {  
  217.             return bitmap;  
  218.         }  
  219.         /** 
  220.          * @param bitmap the bitmap to set 
  221.          */  
  222.         public void setBitmap(Bitmap bitmap) {  
  223.             this.bitmap = bitmap;  
  224.         }  
  225.         @Override  
  226.         public int hashCode() {  
  227.             return this.getFileName().hashCode();  
  228.         }  
  229.           
  230.         @Override  
  231.         public boolean equals(Object o) {  
  232.             LoadImage loadImg = (LoadImage)o;  
  233.             return this.getFileName().equals(loadImg.getFileName());  
  234.         }  
  235.           
  236.      }  
 

【2】、图片展示布局

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout   
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <GridView   
  8.         android:id="@+id/picture_grid"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"   
  11.         android:numColumns="auto_fit"  
  12.         android:stretchMode="columnWidth"  
  13.         android:columnWidth="70dip"  
  14.         android:gravity="center"      
  15.      />  
  16.      <TextView   
  17.         android:id="@+id/pic_seclet_num"  
  18.         android:layout_width="fill_parent"   
  19.         android:layout_height="wrap_content"  
  20.         android:background="@drawable/btn"  
  21.         android:textSize="20sp"  
  22.         android:gravity="center"  
  23.         android:visibility="gone"  
  24.      />  
  25.     <Button   
  26.         android:id="@+id/pic_delete"  
  27.         android:layout_width="fill_parent"   
  28.         android:layout_height="wrap_content"  
  29.         android:text="@string/deletecontact"  
  30.         android:layout_gravity="bottom"  
  31.         android:textSize="20sp"  
  32.         android:visibility="gone"  
  33.         style="@style/btn_style"  
  34.     />  
  35. </FrameLayout>  
 

【3】、适配器类

  /**

Java代码   收藏代码
  1.  * 图片适配器  
  2.  * @author aokunsang  
  3.  * @Date 2011-12-6  
  4.  */  
  5. public class ImageAdapter extends BaseAdapter {  
  6.   
  7.     private List<LoadImage> picList = new ArrayList<LoadImage>();    //图片集合  
  8.     private List<String> picNumber = new ArrayList<String>();       //选中图片的位置集合  
  9.       
  10.     private LayoutInflater inflater;  
  11.       
  12.     public ImageAdapter(Context mContext){  
  13.         inflater = LayoutInflater.from(mContext);  
  14.     }  
  15.       
  16.     @Override  
  17.     public int getCount() {  
  18.         return picList.size();  
  19.     }  
  20.   
  21.     @Override  
  22.     public Object getItem(int position) {  
  23.         return picList.get(position);  
  24.     }  
  25.     /** 
  26.      * 添加选中状态的图片位置 
  27.      * @param position 
  28.      */  
  29.     public void addNumber(String position){  
  30.         picNumber.add(position);  
  31.     }  
  32.     /** 
  33.      * 去除已选中状态的图片位置 
  34.      * @param position 
  35.      */  
  36.     public void delNumber(String position){  
  37.         picNumber.remove(position);  
  38.     }  
  39.     /** 
  40.      * 清空已选中的图片状态 
  41.      */  
  42.     public void clear(){  
  43.         picNumber.clear();  
  44.         notifyDataSetChanged();   
  45.     }  
  46.     /** 
  47.      * 添加图片 
  48.      * @param bitmap 
  49.      */  
  50.     public void addPhoto(LoadImage loadImage){  
  51.         picList.add(loadImage);  
  52.         notifyDataSetChanged();  
  53.     }  
  54.     /** 
  55.      * 删除图片 
  56.      * @param loadimgLs 
  57.      */  
  58.     public void deletePhoto(List<LoadImage> loadimgLs){  
  59.         for(LoadImage img:loadimgLs){  
  60.             if(picList.contains(img)){  
  61.                 picList.remove(img);  
  62.             }  
  63.         }  
  64.         picNumber.clear();  
  65.         notifyDataSetChanged();  
  66.     }  
  67.     @Override  
  68.     public long getItemId(int position) {  
  69.         return position;  
  70.     }  
  71.   
  72.     @Override  
  73.     public View getView(int position, View convertView, ViewGroup parent) {  
  74.         ViewHolder holder = null;  
  75.         if(holder==null){  
  76.             holder = new ViewHolder();  
  77.             convertView = inflater.inflate(R.layout.picturescan_item, null);  
  78.             holder.image1 = (ImageView)convertView.findViewById(R.id.scan_img);  
  79.             holder.image2 = (ImageView)convertView.findViewById(R.id.scan_select);  
  80.             convertView.setTag(holder);  
  81.         }else{  
  82.             holder = (ViewHolder)convertView.getTag();  
  83.         }  
  84.         Drawable bit = new BitmapDrawable(picList.get(position).getBitmap());  
  85.         holder.image1.setBackgroundDrawable(bit);  
  86.         if(picNumber.contains(""+position)){    //如果该图片在选中状态,使其右上角的小对号图片显示,并且添加边框。  
  87.             holder.image2.setVisibility(View.VISIBLE);  
  88.             holder.image1.setImageResource(R.drawable.border);  
  89.         }else{  
  90.             holder.image2.setVisibility(View.GONE);  
  91.         }  
  92.         return convertView;  
  93.     }  
  94.       
  95.     public static class ViewHolder{  
  96.         public ImageView image1;     //要显示的图片  
  97.         public ImageView image2;     //图片右上角的小对号图片(标示选中状态的玩意)  
  98.     }  
  99. }  
 

【4】、gridview的item布局

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingTop="3dip"  
  6.     android:paddingRight="3dip"  
  7.     >  
  8.   
  9.     <ImageView   
  10.         android:id="@+id/scan_img"  
  11.         android:scaleType="centerCrop"  
  12.         android:layout_height="75dip"  
  13.         android:layout_width="90dip"  
  14.         />  
  15.     <ImageView   
  16.         android:id="@+id/scan_select"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_width="wrap_content"  
  19.         android:src="@drawable/selected"  
  20.         android:layout_alignRight="@id/scan_img"  
  21.         android:layout_alignParentTop="true"  
  22.         android:padding="4dip"  
  23.         />      
  24. </RelativeLayout>  






android:descendantFocusability="blocksDescendants"

=====

touch_down-----longclick------touch_up------click

touch(return false)----longclick(return true)----touch(return false)----click

=====

touch(return false)----longclick(return true)----touch(return false)----click
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值