zoukankan      html  css  js  c++  java
  • [Android学习系列13]关于Gridview的一些事

    用mvc的思想去理解 数据源,adapter,xxxView的关系,写代码就轻松多了

    先写一个简单的gridview

    第一版:只有图片

    xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingTop="10dp"
        tools:context=".ActivityMain" >
    
        <GridView
            android:id="@+id/gridView1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:numColumns="3"
            android:columnWidth="90dp"
            android:horizontalSpacing="10dp"
            android:verticalSpacing="10dp"
            android:stretchMode="spacingWidth"
             >
        </GridView>
    
    </LinearLayout>
    View Code

    java代码

    public class ActivityMain extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            
            GridView gridView = (GridView)findViewById(R.id.gridView1);
            gridView.setAdapter( new MyGridviewAdapter(this) );
            
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
        
        
        
        class MyGridviewAdapter extends BaseAdapter {
            
            Context context;  //传入ActivityMain给adapter,创建imageview的时候要用到
            
            //做一个数组存图表的id
            int []imagesId = {R.drawable.icon1,R.drawable.icon2,R.drawable.icon3,
                              R.drawable.icon4,R.drawable.icon5,R.drawable.icon6,
                              R.drawable.icon7,R.drawable.icon8,R.drawable.icon9};
            
            MyGridviewAdapter(Context con) {
                this.context = con;
            }
            
            @Override
            public int getCount() {
                return imagesId.length;
            }
    
            @Override
            public Object getItem(int arg0) {
                return arg0;
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //这里重头戏,既然要getview,就返回一个图标的imageview给它
                
                ImageView imgview = new ImageView(context);
                imgview.setImageResource( imagesId[position] );
                
                return imgview; 
                
                
            }
    
            
        }
        
        
    
    }
    View Code

    第二版:只有图片

    上面的有点问题,看其他人的代码,会对convertView做一个null判断,避免重复创建,节约资源

    改进

    修改getview方法:

            public View getView(int position, View convertView, ViewGroup parent) {
                //这里重头戏,既然要getview,就返回一个图标的imageview给它
                
                //ImageView imgview = new ImageView(context);
                //imgview.setImageResource( imagesId[position] );
                
                ImageView imgview;
                if( convertView == null )
                {
                    imgview = new ImageView(context);
                    imgview.setImageResource( imagesId[position] );
                }
                else
                {
                    imgview = (ImageView)convertView;
                }
                
                
                return imgview; 
                
                
            }
    View Code

     长这样:

    第三版:  图片 + 文字

    首先自定义一个grid_one_item.xml,里面混和了图片和文字

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
        
        <ImageView 
            android:id="@+id/grid_item_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        
        <TextView 
            android:id="@+id/grid_item_text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"/>
        
    
    </LinearLayout>
    View Code

    java代码 重点理解适配器部分

    public class ActivityMain extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            
            GridView gridView = (GridView)findViewById(R.id.gridView1);
            gridView.setAdapter( new MyGridviewAdapter(this) );
            
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
        
        
        //拥有textview的string内容  和imageview的资源id
        class IconInfo {
            String text;
            int imageid;
        }
        
        //一个混合了textview和imageview的类
        class MixedView {
            ImageView imgview;
            TextView textview;
        }
        
        
        class MyGridviewAdapter extends BaseAdapter {
            
            Context context;  //传入ActivityMain给adapter,创建view的时候要用到
            LayoutInflater inflater;  
            List<IconInfo> iconInfoList;
            
            
            //做一个数组存图表的id
            int []imagesId = {R.drawable.icon1,R.drawable.icon2,R.drawable.icon3,
                              R.drawable.icon4,R.drawable.icon5,R.drawable.icon6,
                              R.drawable.icon7,R.drawable.icon8,R.drawable.icon9};
            String []titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8","标题9"};
            
            
            MyGridviewAdapter(Context con) {
                
                this.context = con;
                inflater = LayoutInflater.from(context);
                
                iconInfoList = new ArrayList<IconInfo>();
                for(int i=0; i<imagesId.length; i++)
                {
                    IconInfo iconInfo = new IconInfo();
                    iconInfo.imageid = imagesId[i];
                    iconInfo.text = titles[i];
                    iconInfoList.add(iconInfo);
                }
                
            }
            
            @Override
            public int getCount() {
                return imagesId.length;
            }
    
            @Override
            public Object getItem(int arg0) {
                return arg0;
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                MixedView mixedView;
                //用setTag() getTag()  来节约findViewById所消耗的性能  
                if( convertView == null )
                {
                    convertView = inflater.inflate(R.layout.grid_one_item, null);
                    mixedView = new MixedView();
                    mixedView.imgview  = (ImageView)convertView.findViewById(R.id.grid_item_image);
                    mixedView.textview = (TextView)convertView.findViewById(R.id.grid_item_text); 
                    convertView.setTag(mixedView);
                }
                else
                {
                    mixedView = (MixedView)convertView.getTag();
                }
                
                mixedView.imgview.setImageResource( iconInfoList.get(position).imageid );
                mixedView.textview.setText( iconInfoList.get(position).text );
                
                return convertView; 
                
                
            }
    
            
        }
        
        
    
    }
    View Code

    个人粗俗地理解这两句(错了求指正):

    convertView.setTag(mixedView);  //  为convertView设定一个   指向mixedView的引用

    mixedView= (MixedView) convertView.getTag();  //  把convertView所引用的对象赋给mixedView,  也就是说,convertView和mixedView引用的是同一个内存里的东西

    //所以getview时  我们做处理的是mixedView,还可以返回convertView,因为他们引用的是同一个东西啊

     最后长这样:

    android:stretchMode 参考下图

    更多参考:

    http://liangruijun.blog.51cto.com/3061169/647355

    http://www.cnblogs.com/topcoderliu/archive/2011/06/07/2074419.html

  • 相关阅读:
    mysql高级之编程优化
    高性能产品必由之路
    linux下安装xhprof
    linux下安装apc
    linux下安装vld
    python装饰器通俗易懂的解释!
    python函数基础 与文件操作
    python基础入门一(语法基础)
    iOS Keychain,SSKeychain,使用 理解 原理
    起头
  • 原文地址:https://www.cnblogs.com/sleeptothedeath/p/3698351.html
Copyright © 2011-2022 走看看