android gridview的item放大問題,setOnItemSelectedListener不執行的解決辦法。
阿新 • • 發佈:2019-01-08
提前宣告:本篇部落格是基於電視機頂盒的,全部操作是用遙控器。
我要實現這樣的一個效果。點選gridview的item,有放大的效果。
先看下效果圖。
本篇部落格的重難點:
1.怎麼讓選中的item變大。
2.變大後,怎麼讓item全部顯示出來,而不是被gridview的邊緣擋住。
3.怎麼每次進入gridview當前item變大。即解決setOnItemSelectedListener不響應的方法。
我先將我的程式碼分開,來分別講解著三個重點,之後會將整個原始碼上傳。
1.怎麼讓選中的item變大。
在BaseAdapter裡的getView方法中,進行如下的判斷。
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- if (convertView == null) {
- convertView = LayoutInflater.from(context).inflate(
-
R.layout.item_app_wall2, parent, false
- holder = new ViewHolder();
- holder.icon = (ImageView) convertView
- .findViewById(R.id.app_icon);
- holder.name = (TextView) convertView
- .findViewById(R.id.app_name);
-
holder.size = (TextView) convertView
- .findViewById(R.id.app_size);
- holder.count = (TextView) convertView
- .findViewById(R.id.app_count);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- if (selected == position) {
- // 如果選中的是當前item,則將當前item變大。
- convertView.bringToFront();
- animEffect.setAttributs(1.0F, 1.0366F, 1.0F, 1.0366F, 100L);
- Animation localAnimation = animEffect.createAnimation();
- convertView.startAnimation(localAnimation);
- }
- if (last == position) {
- // 將上一個選中的item恢復原樣。
- animEffect.setAttributs(1.0366F, 1.0F, 1.0366F, 1.0F, 0L);
- convertView.startAnimation(animEffect.createAnimation());
- }
- return convertView;
- }
然後在程式碼裡,呼叫appWallBaseAdapter.notifyDataSetChanged()該方法。如下所示:
- appGrid.setOnItemSelectedListener(new OnItemSelectedListener() {
- @Override
- publicvoid onItemSelected(AdapterView<?> parent, View view,
- int position, long id) {
- Log.i("tag", "OnItemSelectedListener執行了");
- isSelect = true;
- last = selected;
- selected = position;
- appWallBaseAdapter.notifyDataSetChanged();
- appGrid.smoothScrollToPositionFromTop(position, 300);
- }
- @Override
- publicvoid onNothingSelected(AdapterView<?> parent) {
- Log.i("tag", "");
- }
- });
如果是當前選中的item,則直接將convertView變大。其中animEffect是自定義的。
- /**
- * 自定義動畫類
- */
- ScaleAnimEffect animEffect = new ScaleAnimEffect();
ScaleAnimEffect類裡的內容是:
- package com.example.test;
- import android.view.animation.AccelerateInterpolator;
- import android.view.animation.Animation;
- import android.view.animation.ScaleAnimation;
- publicclass ScaleAnimEffect {
- privatelong duration;
- privatefloat fromXScale;
- privatefloat fromYScale;
- privatefloat toXScale;
- privatefloat toYScale;
- publicvoid setAttributs(float paramFloat1, float paramFloat2,
- float paramFloat3, float paramFloat4, long paramLong) {
- this.fromXScale = paramFloat1;
- this.fromYScale = paramFloat3;
- this.toXScale = paramFloat2;
- this.toYScale = paramFloat4;
- this.duration = paramLong;
- }
- public Animation createAnimation() {
- /**
- * @param fromX
- * 動畫開始前水平方向的伸縮比例大小
- * @param toX
- * 動畫結束後,水平方向的伸縮比例大小
- * @param fromY
- * 動畫開始前,豎直方向的比例大小
- * @param toY
- * 動畫結束結束後,豎直方向的比例大小
- * @param pivotXType
- * 指定pivotXValue以哪個為座標點為中心來旋轉。 Animation.ABSOLUTE,
- * Animation.RELATIVE_TO_SELF, 或者
- * Animation.RELATIVE_TO_PARENT這三個其中之一。
- * @param pivotXValue
- * 正在伸縮的物件的點的x座標,指定為絕對數,並且0是左邊緣(當物件改變尺寸的時候,點保持不變。)
- * 如果pivotXType是
- * Animation.ABSOLUTE,這個值既可以是絕對數,也可以為百分數(1.0位100%)
- *
- * @param pivotYType
- * 指定pivotYValue以哪個為座標點為中心來旋轉。 Animation.ABSOLUTE,
- * Animation.RELATIVE_TO_SELF, 或者
- * Animation.RELATIVE_TO_PARENT這三個其中之一。
- * @param pivotYValue
- * 正在伸縮的物件的點的y座標,指定為絕對數,並且0是左邊緣(當物件改變尺寸的時候,點保持不變。)
- * 如果pivotYType是
- * Animation.ABSOLUTE,這個值既可以是絕對數,也可以為百分數(1.0位100%)
- */
- ScaleAnimation localScaleAnimation = new ScaleAnimation(
- this.fromXScale, this.toXScale, this.fromYScale, this.toYSc