1. 程式人生 > >android gridview的item放大問題,setOnItemSelectedListener不執行的解決辦法。

android gridview的item放大問題,setOnItemSelectedListener不執行的解決辦法。

提前宣告:本篇部落格是基於電視機頂盒的,全部操作是用遙控器。

我要實現這樣的一個效果。點選gridview的item,有放大的效果。

先看下效果圖。



本篇部落格的重難點:

1.怎麼讓選中的item變大。

2.變大後,怎麼讓item全部顯示出來,而不是被gridview的邊緣擋住。

3.怎麼每次進入gridview當前item變大。即解決setOnItemSelectedListener不響應的方法。

我先將我的程式碼分開,來分別講解著三個重點,之後會將整個原始碼上傳。

1.怎麼讓選中的item變大。

在BaseAdapter裡的getView方法中,進行如下的判斷。

  1. @Override
  2.         public View getView(int position, View convertView, ViewGroup parent) {  
  3.             ViewHolder holder;  
  4.             if (convertView == null) {  
  5.                 convertView = LayoutInflater.from(context).inflate(  
  6.                         R.layout.item_app_wall2, parent, false
    );  
  7.                 holder = new ViewHolder();  
  8.                 holder.icon = (ImageView) convertView  
  9.                         .findViewById(R.id.app_icon);  
  10.                 holder.name = (TextView) convertView  
  11.                         .findViewById(R.id.app_name);  
  12.                 holder.size = (TextView) convertView  
  13.                         .findViewById(R.id.app_size);  
  14.                 holder.count = (TextView) convertView  
  15.                         .findViewById(R.id.app_count);  
  16.                 convertView.setTag(holder);  
  17.             } else {  
  18.                 holder = (ViewHolder) convertView.getTag();  
  19.             }  
  20.             if (selected == position) {  
  21.                 // 如果選中的是當前item,則將當前item變大。
  22.                 convertView.bringToFront();  
  23.                 animEffect.setAttributs(1.0F, 1.0366F, 1.0F, 1.0366F, 100L);  
  24.                 Animation localAnimation = animEffect.createAnimation();  
  25.                 convertView.startAnimation(localAnimation);  
  26.             }  
  27.             if (last == position) {  
  28.                 // 將上一個選中的item恢復原樣。
  29.                 animEffect.setAttributs(1.0366F, 1.0F, 1.0366F, 1.0F, 0L);  
  30.                 convertView.startAnimation(animEffect.createAnimation());  
  31.             }  
  32.             return convertView;  
  33.         }  

然後在程式碼裡,呼叫appWallBaseAdapter.notifyDataSetChanged()該方法。如下所示:

  1. appGrid.setOnItemSelectedListener(new OnItemSelectedListener() {  
  2.             @Override
  3.             publicvoid onItemSelected(AdapterView<?> parent, View view,  
  4.                     int position, long id) {  
  5.                 Log.i("tag""OnItemSelectedListener執行了");  
  6.                 isSelect = true;  
  7.                 last = selected;  
  8.                 selected = position;  
  9.                 appWallBaseAdapter.notifyDataSetChanged();  
  10.                 appGrid.smoothScrollToPositionFromTop(position, 300);  
  11.             }  
  12.             @Override
  13.             publicvoid onNothingSelected(AdapterView<?> parent) {  
  14.                 Log.i("tag""");  
  15.             }  
  16.         });  


如果是當前選中的item,則直接將convertView變大。其中animEffect是自定義的。
  1. /** 
  2.      * 自定義動畫類 
  3.      */
  4.     ScaleAnimEffect animEffect = new ScaleAnimEffect();  

ScaleAnimEffect類裡的內容是:

  1. package com.example.test;  
  2. import android.view.animation.AccelerateInterpolator;  
  3. import android.view.animation.Animation;  
  4. import android.view.animation.ScaleAnimation;  
  5. publicclass ScaleAnimEffect {  
  6.     privatelong duration;  
  7.     privatefloat fromXScale;  
  8.     privatefloat fromYScale;  
  9.     privatefloat toXScale;  
  10.     privatefloat toYScale;  
  11.     publicvoid setAttributs(float paramFloat1, float paramFloat2,  
  12.             float paramFloat3, float paramFloat4, long paramLong) {  
  13.         this.fromXScale = paramFloat1;  
  14.         this.fromYScale = paramFloat3;  
  15.         this.toXScale = paramFloat2;  
  16.         this.toYScale = paramFloat4;  
  17.         this.duration = paramLong;  
  18.     }  
  19.     public Animation createAnimation() {  
  20.         /** 
  21.          * @param fromX 
  22.          *            動畫開始前水平方向的伸縮比例大小 
  23.          * @param toX 
  24.          *            動畫結束後,水平方向的伸縮比例大小 
  25.          * @param fromY 
  26.          *            動畫開始前,豎直方向的比例大小 
  27.          * @param toY 
  28.          *            動畫結束結束後,豎直方向的比例大小 
  29.          * @param pivotXType 
  30.          *            指定pivotXValue以哪個為座標點為中心來旋轉。 Animation.ABSOLUTE, 
  31.          *            Animation.RELATIVE_TO_SELF, 或者 
  32.          *            Animation.RELATIVE_TO_PARENT這三個其中之一。 
  33.          * @param pivotXValue 
  34.          *            正在伸縮的物件的點的x座標,指定為絕對數,並且0是左邊緣(當物件改變尺寸的時候,點保持不變。) 
  35.          *            如果pivotXType是 
  36.          *            Animation.ABSOLUTE,這個值既可以是絕對數,也可以為百分數(1.0位100%) 
  37.          *  
  38.          * @param pivotYType 
  39.          *            指定pivotYValue以哪個為座標點為中心來旋轉。 Animation.ABSOLUTE, 
  40.          *            Animation.RELATIVE_TO_SELF, 或者 
  41.          *            Animation.RELATIVE_TO_PARENT這三個其中之一。 
  42.          * @param pivotYValue 
  43.          *            正在伸縮的物件的點的y座標,指定為絕對數,並且0是左邊緣(當物件改變尺寸的時候,點保持不變。) 
  44.          *            如果pivotYType是 
  45.          *            Animation.ABSOLUTE,這個值既可以是絕對數,也可以為百分數(1.0位100%) 
  46.          */
  47.         ScaleAnimation localScaleAnimation = new ScaleAnimation(  
  48.                 this.fromXScale, this.toXScale, this.fromYScale, this.toYSc