android gridview的item放大问题,setOnItemSelectedListener不执行的解决办法。

转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/46858019


提前声明:本篇博客是基于电视机顶盒的,全部操作是用遥控器。


我要实现这样的一个效果。点击gridview的item,有放大的效果。

先看下效果图。




android gridview的item放大问题,setOnItemSelectedListener不执行的解决办法。


android gridview的item放大问题,setOnItemSelectedListener不执行的解决办法。


本篇博客的重难点:

1.怎么让选中的item变大。

2.变大后,怎么让item全部显示出来,而不是被gridview的边缘挡住。

3.怎么每次进入gridview当前item变大。即解决setOnItemSelectedListener不响应的方法。


我先将我的代码分开,来分别讲解着三个重点,之后会将整个源码上传。


1.怎么让选中的item变大。


在BaseAdapter里的getView方法中,进行如下的判断。

[java] view plaincopy
  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()该方法。如下所示:

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


如果是当前选中的item,则直接将convertView变大。其中animEffect是自定义的。

[java] view plaincopy
  1. /** 
  2.      * 自定义动画类 
  3.      */  
  4.     ScaleAnimEffect animEffect = new ScaleAnimEffect();  



ScaleAnimEffect类里的内容是:

[java] view plaincopy
  1. package com.example.test;  
  2.   
  3. import android.view.animation.AccelerateInterpolator;  
  4. import android.view.animation.Animation;  
  5. import android.view.animation.ScaleAnimation;  
  6.   
  7. public class ScaleAnimEffect {  
  8.     private long duration;  
  9.     private float fromXScale;  
  10.     private float fromYScale;  
  11.     private float toXScale;  
  12.     private float toYScale;  
  13.   
  14.     public void setAttributs(float paramFloat1, float paramFloat2,  
  15.             float paramFloat3, float paramFloat4, long paramLong) {  
  16.         this.fromXScale = paramFloat1;  
  17.         this.fromYScale = paramFloat3;  
  18.         this.toXScale = paramFloat2;  
  19.         this.toYScale = paramFloat4;  
  20.         this.duration = paramLong;  
  21.     }  
  22.   
  23.     public Animation createAnimation() {  
  24.         /** 
  25.          * @param fromX 
  26.          *            动画开始前水平方向的伸缩比例大小 
  27.          * @param toX 
  28.          *            动画结束后,水平方向的伸缩比例大小 
  29.          * @param fromY 
  30.          *            动画开始前,竖直方向的比例大小 
  31.          * @param toY 
  32.          *            动画结束结束后,竖直方向的比例大小 
  33.          * @param pivotXType 
  34.          *            指定pivotXValue以哪个为坐标点为中心来旋转。 Animation.ABSOLUTE, 
  35.          *            Animation.RELATIVE_TO_SELF, 或者 
  36.          *            Animation.RELATIVE_TO_PARENT这三个其中之一。 
  37.          * @param pivotXValue 
  38.          *            正在伸缩的对象的点的x坐标,指定为绝对数,并且0是左边缘(当对象改变尺寸的时候,点保持不变。) 
  39.          *            如果pivotXType是 
  40.          *            Animation.ABSOLUTE,这个值既可以是绝对数,也可以为百分数(1.0位100%) 
  41.          *  
  42.          * @param pivotYType 
  43.          *            指定pivotYValue以哪个为坐标点为中心来旋转。 Animation.ABSOLUTE, 
  44.          *            Animation.RELATIVE_TO_SELF, 或者 
  45.          *            Animation.RELATIVE_TO_PARENT这三个其中之一。 
  46.          * @param pivotYValue 
  47.          *            正在伸缩的对象的点的y坐标,指定为绝对数,并且0是左边缘(当对象改变尺寸的时候,点保持不变。) 
  48.          *            如果pivotYType是 
  49.          *            Animation.ABSOLUTE,这个值既可以是绝对数,也可以为百分数(1.0位100%) 
  50.          */  
  51.         ScaleAnimation localScaleAnimation = new ScaleAnimation(  
  52.                 this.fromXScale, this.toXScale, this.fromYScale, this.toYScale,  
  53.                 Animation.RELATIVE_TO_SELF, 0.5F, Animation.RELATIVE_TO_SELF,  
  54.                 0.5F);  
  55.         // 动画执行完成后,是否停留在执行完的状态  
  56.         localScaleAnimation.setFillAfter(true);  
  57.         // 在动画开始的地方速率比较慢,然后开始加速  
  58.         localScaleAnimation.setInterpolator(new AccelerateInterpolator());  
  59.         // 设置动画持续时间  
  60.         localScaleAnimation.setDuration(this.duration);  
  61.         return localScaleAnimation;  
  62.     }  
  63.   
  64. }  


因为之前的一篇文章已经写过了变大效果,所以这次便不详细叙述,你可以直接查看这篇文章。http://blog.csdn.net/harryweasley/article/details/46678315图片获得焦点变大并显示在最前方,覆盖后面的图片


2.变大后,怎么让item完全显示出来,而不是被gridview的边缘挡住。


我都都知道,gridview中的item是靠着其边缘的,那么在代码中,将边缘的item变大后,便会出现显示不完全的现象。如图所示:


android gridview的item放大问题,setOnItemSelectedListener不执行的解决办法。


android gridview的item放大问题,setOnItemSelectedListener不执行的解决办法。



为了避免这样的情况发生,我在item的布局中,RelativeLayout中又加入了一个RelativeLayout,里面的RelativeLayout用了margin变量,保证内容和父控件有一定的距离。如下所示:

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content" >  
  5.   
  6.     <RelativeLayout  
  7.         android:layout_width="@dimen/app_item_width"  
  8.         android:layout_height="@dimen/app_item_height"  
  9.         android:layout_margin="13dp"  
  10.         android:background="@drawable/background_selector2" >  
  11.   
  12.         <ImageView  
  13.             android:id="@+id/app_icon"  
  14.             android:layout_width="@dimen/detail_left"  
  15.             android:layout_height="@dimen/detail_left"  
  16.             android:layout_alignParentLeft="true"  
  17.             android:layout_centerVertical="true"  
  18.             android:layout_marginLeft="30dp"  
  19.             android:src="@drawable/ic_launcher" />  
  20.   
  21.         <RelativeLayout  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="@dimen/detail_left"  
  24.             android:layout_alignBottom="@id/app_icon"  
  25.             android:layout_alignTop="@id/app_icon"  
  26.             android:layout_marginLeft="12dp"  
  27.             android:layout_toRightOf="@id/app_icon" >  
  28.   
  29.             <TextView  
  30.                 android:id="@+id/app_name"  
  31.                 android:layout_width="wrap_content"  
  32.                 android:layout_height="wrap_content"  
  33.                 android:layout_alignParentTop="true"  
  34.                 android:gravity="top"  
  35.                 android:text="应用名称"  
  36.                 android:textColor="@color/white"  
  37.                 android:textSize="@dimen/text_item_app_name" />  
  38.   
  39.   
  40.   
  41.             <TextView  
  42.                 android:id="@+id/app_size"  
  43.                 android:layout_width="wrap_content"  
  44.                 android:layout_height="wrap_content"  
  45.                 android:layout_alignParentBottom="true"  
  46.                 android:layout_below="@id/app_name"  
  47.                 android:gravity="bottom"  
  48.                 android:text="13M"  
  49.                 android:textColor="@color/text_search"  
  50.                 android:textSize="@dimen/text_search_game" />  
  51.   
  52.             <TextView  
  53.                 android:id="@+id/app_count"  
  54.                 android:layout_width="wrap_content"  
  55.                 android:layout_height="wrap_content"  
  56.                 android:layout_alignParentBottom="true"  
  57.                 android:layout_below="@id/app_name"  
  58.                 android:layout_marginLeft="20dp"  
  59.                 android:layout_toRightOf="@id/app_size"  
  60.                 android:gravity="bottom"  
  61.                 android:text="100次"  
  62.                 android:textColor="@color/text_search"  
  63.                 android:textSize="@dimen/text_search_game" />  
  64.         </RelativeLayout>  
  65.     </RelativeLayout>  
  66.   
  67. </RelativeLayout>  




3.怎么每次进入gridview当前item变大。即解决setOnItemSelectedListener不响应的方法。


这个应该是最难点了的,我花了很长的时间来研究它,最终找到了一个还算可以的方法,在这里写一下。


因为我的放大效果是在setOnItemSelectedListener方法里,来进行调用的,但是,当我实测的时候,发现setOnItemSelectedListener这个方法在第一次进入的时候,有时候会 不执行,有时候又会去执行,我也找到了他不执行的规律,但是,却很难去具体研究,可能是android内部机构的问题吧。


这样就会出现问题,如果我只是在setOnItemSelectedListener这个方法里来判断是否放大的话,那么有时候item是不会放大的,这显然是不对的。为了解决这个问题,我引入了setOnFocusChangeListener这个方法,来监gridview听焦点状态改变。经过测试,我知道了,不管怎么进入和出去gridview,setOnFocusChangeListener是一定会执行的,而且是先于setOnItemSelectedListener这个方法。

我的想法是,先进行setOnItemSelectedListener来将item变大,如果这个方法没有执行,再在setOnFocusChangeListener,将item变大,为了等待setOnItemSelectedListener是否执行的消息isSelect,在setOnFocusChangeListener开启子线程,等待isSelect,如果isSelect为true,则不执行本方法里appWallBaseAdapter.notifyDataSetChanged();如果为false则执行。


setOnFocusChangeListener代码如下所示,

[java] view plaincopy
  1. appGrid.setOnFocusChangeListener(new OnFocusChangeListener() {  
  2.   
  3.             @Override  
  4.             public void onFocusChange(View v, boolean hasFocus) {  
  5.                 if (hasFocus) {  
  6.                     // 如果获取到焦点  
  7.                     // 开启线程等待50ms,看是否setOnItemSelectedListener执行,没有执行则执行此方法  
  8.                     new Thread(run).start();  
  9.   
  10.                 } else {  
  11.                     last = selected;  
  12.                     Log.i("tag", last + "onfoceus 出来的这里是几..............");  
  13.                     selected = -1;  
  14.                     appWallBaseAdapter.notifyDataSetChanged();  
  15.                     isSelect = false;  
  16.                 }  
  17.             }  
  18.         });  


开启线程等待50ms。

[java] view plaincopy
  1. Runnable run = new Runnable() {  
  2.   
  3.         @Override  
  4.         public void run() {  
  5.             try {  
  6.                 Thread.sleep(50);  
  7.                 handler.sendEmptyMessage(0);  
  8.             } catch (InterruptedException e) {  
  9.                 // TODO Auto-generated catch block  
  10.                 e.printStackTrace();  
  11.             }  
  12.         }  
  13.     };  
  14.     Handler handler = new Handler() {  
  15.         public void handleMessage(android.os.Message msg) {  
  16.             if (isSelect) {  
  17.                 isSelect = false;  
  18.             } else {  
  19.                 // 如果是第一次进入该gridView,则进入第一个item,如果不是第一次进去,则选择上次出来的item  
  20.                 if (last == -1) {  
  21.                     selected = 0;  
  22.                 } else {  
  23.                     selected = last;  
  24.                 }  
  25.   
  26.                 last = -1;  
  27.                 appWallBaseAdapter.notifyDataSetChanged();  
  28.             }  
  29.         };  
  30.     };  


setOnItemSelectedListener方法如下所示,如果执行了则将isSelect置为true。

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




现在整个项目便大功告成了,MainActivity里的所有代码如下所示:

[java] view plaincopy
  1. package com.example.test;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.os.Bundle;  
  8. import android.os.Handler;  
  9. import android.util.Log;  
  10. import android.view.LayoutInflater;  
  11. import android.view.View;  
  12. import android.view.View.OnFocusChangeListener;  
  13. import android.view.ViewGroup;  
  14. import android.view.Window;  
  15. import android.view.animation.Animation;  
  16. import android.widget.AdapterView;  
  17. import android.widget.AdapterView.OnItemClickListener;  
  18. import android.widget.AdapterView.OnItemSelectedListener;  
  19. import android.widget.BaseAdapter;  
  20. import android.widget.GridView;  
  21. import android.widget.ImageView;  
  22. import android.widget.ListView;  
  23. import android.widget.TextView;  
  24.   
  25. public class MainActivity extends Activity {  
  26.     /** 
  27.      * 各种应用的gridView 
  28.      */  
  29.     private GridView appGrid;  
  30.     /** 
  31.      * 界面左边的各种信息listView 
  32.      *  
  33.      */  
  34.     private ListView appWallListView;  
  35.     /** 
  36.      * 自定义动画类 
  37.      */  
  38.     ScaleAnimEffect animEffect = new ScaleAnimEffect();  
  39.     /** 
  40.      * 应用墙的适配器 
  41.      */  
  42.     AppWallBaseAdapter appWallBaseAdapter;  
  43.     /** 
  44.      * 当前选择的item位置 
  45.      */  
  46.     int selected = -1;  
  47.     /** 
  48.      * 上一次选择的item位置 
  49.      */  
  50.     int last = -1;  
  51.     /** 
  52.      * 是否onItemSelected方法执行了 
  53.      */  
  54.     boolean isSelect = false;  
  55.     /** 
  56.      * 界面左边上下的箭头图片 
  57.      */  
  58.     ImageView top_image, bottom_iamge;  
  59.   
  60.     ArrayList<String> list = new ArrayList<String>();  
  61.   
  62.     @Override  
  63.     protected void onCreate(Bundle savedInstanceState) {  
  64.   
  65.         super.onCreate(savedInstanceState);  
  66.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  67.         setContentView(R.layout.activity_app_wall);  
  68.         top_image = (ImageView) findViewById(R.id.top);  
  69.         bottom_iamge = (ImageView) findViewById(R.id.bottom);  
  70.         appGrid = (GridView) findViewById(R.id.app_wall);  
  71.         appGridShow();  
  72.         appWallListViewShow();  
  73.         appWallListView.requestFocus();  
  74.   
  75.     }  
  76.   
  77.     /** 
  78.      * 应用墙应用展示界面 
  79.      */  
  80.     private void appGridShow() {  
  81.         appWallBaseAdapter = new AppWallBaseAdapter(this);  
  82.         appGrid.setAdapter(appWallBaseAdapter);  
  83.         appGrid.setOnItemSelectedListener(new OnItemSelectedListener() {  
  84.   
  85.             @Override  
  86.             public void onItemSelected(AdapterView<?> parent, View view,  
  87.                     int position, long id) {  
  88.                 Log.i("tag""OnItemSelectedListener执行了");  
  89.                 isSelect = true;  
  90.                 last = selected;  
  91.                 selected = position;  
  92.                 appWallBaseAdapter.notifyDataSetChanged();  
  93.                 appGrid.smoothScrollToPositionFromTop(position, 300);  
  94.   
  95.             }  
  96.   
  97.             @Override  
  98.             public void onNothingSelected(AdapterView<?> parent) {  
  99.                 Log.i("tag""");  
  100.             }  
  101.         });  
  102.   
  103.         appGrid.setOnFocusChangeListener(new OnFocusChangeListener() {  
  104.   
  105.             @Override  
  106.             public void onFocusChange(View v, boolean hasFocus) {  
  107.                 if (hasFocus) {  
  108.                     // 如果获取到焦点  
  109.                     // 开启线程等待50ms,看是否setOnItemSelectedListener执行,没有执行则执行此方法  
  110.                     new Thread(run).start();  
  111.   
  112.                 } else {  
  113.                     last = selected;  
  114.                     Log.i("tag", last + "onfoceus 出来的这里是几..............");  
  115.                     selected = -1;  
  116.                     appWallBaseAdapter.notifyDataSetChanged();  
  117.                     isSelect = false;  
  118.                 }  
  119.             }  
  120.         });  
  121.     }  
  122.   
  123.     Runnable run = new Runnable() {  
  124.   
  125.         @Override  
  126.         public void run() {  
  127.             try {  
  128.                 Thread.sleep(50);  
  129.                 handler.sendEmptyMessage(0);  
  130.             } catch (InterruptedException e) {  
  131.                 // TODO Auto-generated catch block  
  132.                 e.printStackTrace();  
  133.             }  
  134.         }  
  135.     };  
  136.     Handler handler = new Handler() {  
  137.         public void handleMessage(android.os.Message msg) {  
  138.             if (isSelect) {  
  139.                 isSelect = false;  
  140.             } else {  
  141.                 // 如果是第一次进入该gridView,则进入第一个item,如果不是第一次进去,则选择上次出来的item  
  142.                 if (last == -1) {  
  143.                     selected = 0;  
  144.                 } else {  
  145.                     selected = last;  
  146.                 }  
  147.   
  148.                 last = -1;  
  149.                 appWallBaseAdapter.notifyDataSetChanged();  
  150.             }  
  151.         };  
  152.     };  
  153.   
  154.     class AppWallBaseAdapter extends BaseAdapter {  
  155.         private Context context;  
  156.   
  157.         public AppWallBaseAdapter(Context context) {  
  158.             this.context = context;  
  159.         }  
  160.   
  161.         @Override  
  162.         public int getCount() {  
  163.   
  164.             return 13;  
  165.         }  
  166.   
  167.         @Override  
  168.         public Object getItem(int position) {  
  169.   
  170.             return null;  
  171.         }  
  172.   
  173.         @Override  
  174.         public long getItemId(int position) {  
  175.   
  176.             return 0;  
  177.         }  
  178.   
  179.         @Override  
  180.         public View getView(int position, View convertView, ViewGroup parent) {  
  181.             ViewHolder holder;  
  182.             if (convertView == null) {  
  183.                 convertView = LayoutInflater.from(context).inflate(  
  184.                         R.layout.item_app_wall2, parent, false);  
  185.                 holder = new ViewHolder();  
  186.                 holder.icon = (ImageView) convertView  
  187.                         .findViewById(R.id.app_icon);  
  188.                 holder.name = (TextView) convertView  
  189.                         .findViewById(R.id.app_name);  
  190.                 holder.size = (TextView) convertView  
  191.                         .findViewById(R.id.app_size);  
  192.                 holder.count = (TextView) convertView  
  193.                         .findViewById(R.id.app_count);  
  194.                 convertView.setTag(holder);  
  195.             } else {  
  196.                 holder = (ViewHolder) convertView.getTag();  
  197.             }  
  198.             if (selected == position) {  
  199.                 // 如果选中的是当前item,则将当前item变大。  
  200.                 convertView.bringToFront();  
  201.                 animEffect.setAttributs(1.0F, 1.0366F, 1.0F, 1.0366F, 100L);  
  202.                 Animation localAnimation = animEffect.createAnimation();  
  203.                 convertView.startAnimation(localAnimation);  
  204.             }  
  205.             if (last == position) {  
  206.                 // 将上一个选中的item恢复原样。  
  207.                 animEffect.setAttributs(1.0366F, 1.0F, 1.0366F, 1.0F, 0L);  
  208.                 convertView.startAnimation(animEffect.createAnimation());  
  209.             }  
  210.             return convertView;  
  211.         }  
  212.   
  213.         class ViewHolder {  
  214.             ImageView icon, grade;  
  215.             TextView name, size, count;  
  216.         }  
  217.   
  218.     }  
  219.   
  220.     /** 
  221.      * 应用墙界面左边展示 
  222.      */  
  223.     private void appWallListViewShow() {  
  224.         for (int i = 0; i < 10; i++) {  
  225.             list.add("网" + i);  
  226.         }  
  227.   
  228.         if (list.size() <= 10) {  
  229.             bottom_iamge.setVisibility(View.INVISIBLE);  
  230.         }  
  231.   
  232.         appWallListView = (ListView) findViewById(R.id.app_wall_listview);  
  233.         appWallListView.setAdapter(new AppWallListBaseAdapter(this, list));  
  234.   
  235.         appWallListView.setOnItemClickListener(new OnItemClickListener() {  
  236.   
  237.             @Override  
  238.             public void onItemClick(AdapterView<?> parent, View view,  
  239.                     int position, long id) {  
  240.             }  
  241.         });  
  242.   
  243.         appWallListView.setOnItemSelectedListener(new OnItemSelectedListener() {  
  244.   
  245.             @Override  
  246.             public void onItemSelected(AdapterView<?> parent, View view,  
  247.                     int position, long id) {  
  248.                 if (position > 4) {  
  249.                     top_image.setVisibility(View.VISIBLE);  
  250.                 }  
  251.   
  252.                 if (position == list.size() - 1) {  
  253.                     bottom_iamge.setVisibility(View.INVISIBLE);  
  254.                 }  
  255.   
  256.                 if (position == 0) {  
  257.                     top_image.setVisibility(View.INVISIBLE);  
  258.                 }  
  259.   
  260.                 if (position < list.size() - 5) {  
  261.                     bottom_iamge.setVisibility(View.VISIBLE);  
  262.                 }  
  263.   
  264.             }  
  265.   
  266.             @Override  
  267.             public void onNothingSelected(AdapterView<?> parent) {  
  268.             }  
  269.         });  
  270.   
  271.     }  
  272.   
  273. }  



activity_app_wall.xml文件如下所示:


[java] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:background="@drawable/main_backgrand" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/text"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_marginLeft="@dimen/detail_left"  
  11.         android:layout_marginTop="@dimen/programa_top"  
  12.         android:text="最新"  
  13.         android:textColor="@color/white"  
  14.         android:textSize="@dimen/text_detail_app_name" />  
  15.   
  16.   
  17.     <ImageView  
  18.         android:id="@+id/top"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_below="@id/text"  
  22.         android:layout_marginLeft="92dp"  
  23.         android:layout_marginTop="@dimen/detail_icon_top"  
  24.         android:visibility="invisible"  
  25.         android:src="@drawable/top_focused" />  
  26.   
  27.     <ImageView  
  28.         android:id="@+id/bottom"  
  29.         android:layout_width="wrap_content"  
  30.         android:layout_height="wrap_content"  
  31.         android:layout_alignParentBottom="true"  
  32.         android:layout_marginBottom="@dimen/detail_left"  
  33.         android:layout_marginLeft="92dp"  
  34.         android:src="@drawable/bottom_focused" />  
  35.   
  36.     <ListView  
  37.         android:id="@+id/app_wall_listview"  
  38.         android:layout_width="108dp"  
  39.         android:layout_height="wrap_content"  
  40.         android:layout_above="@id/bottom"  
  41.         android:layout_below="@id/top"  
  42.         android:layout_marginBottom="42dp"  
  43.         android:layout_marginLeft="49dp"  
  44.         android:layout_marginTop="42dp"  
  45.         android:divider="@android:color/transparent"  
  46.         android:nextFocusDown="@id/app_wall_listview"  
  47.         android:nextFocusUp="@id/app_wall_listview"  
  48.         android:scrollbars="none" >  
  49.     </ListView>  
  50.   
  51.     <RelativeLayout  
  52.         android:layout_width="wrap_content"  
  53.         android:layout_height="wrap_content"  
  54.         android:layout_marginBottom="@dimen/detail_recommend_icon"  
  55.         android:layout_marginLeft="57dp"  
  56.         android:layout_marginRight="@dimen/programa_gridview_left"  
  57.         android:layout_marginTop="100dp"  
  58.         android:layout_toRightOf="@id/app_wall_listview" >  
  59.   
  60.         <GridView  
  61.             android:id="@+id/app_wall"  
  62.             android:layout_width="wrap_content"  
  63.             android:layout_height="wrap_content"  
  64.             android:listSelector="@android:color/transparent"  
  65.             android:numColumns="3"  
  66.             android:scrollbars="none"  
  67.             android:verticalSpacing="@dimen/search_game_left" >  
  68.         </GridView>  
  69.     </RelativeLayout>  
  70.   
  71. </RelativeLayout>  





其实在做本项目的时候,还有一个逻辑问题,就是当前选中的item放大,之前的item恢复原样,这个逻辑也是在代码里进行了注释和体现,希望大家注意。


关于这行代码,convertView = LayoutInflater.from(context).inflate(R.layout.item_app_wall2, parent, false);如果你不不是很懂的话,建议你看这篇文章,我觉得是很重要 的

http://blog.csdn.net/harryweasley/article/details/46646773 

LayoutInflater.inflate方法解析

 )

本项目的完整代码链接:http://download.csdn.net/detail/harryweasley/8886349

上一篇:【Go语言入门教程】Go语言简介


下一篇:Spring Boot【快速入门】