Android的GridView和ScrollView的嵌套

来源于回答频道答题,因此内容都是基于回答频道的原题布局进行

1、布局文件如下

文件名:testxm.xml




    

    

        

        

        

        
    
    

    

        

            

            

                
            
            


            

            
            
            
        
    


2、gridview的item布局文件



         
         


3、activity代码

public class PorterDuffActivity extends Activity{
	private PorterCanvas mPorterCanvas = null;
	private GridView gridView;
	private LinearLayout ll;
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.testxm);
		this.addview();
	}
	private void addview(){
        for(int i=1; i<=35;i++){
            ll=(LinearLayout) findViewById(R.id.fujin_btnlist_tl);
            this.addTwoClassify(i);
        }
	}
	private void makeGridView(int num){
		ArrayList> lstImageItem = new ArrayList>();  
	      for(int i=0;i<10;i++)  
	      {  
	        HashMap map = new HashMap();  
	        map.put("ItemText", num+"NO."+String.valueOf(i));//按序号做ItemText  
	        lstImageItem.add(map);  
	      }  
	      //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应  
	      SimpleAdapter saImageItems = new SimpleAdapter(this, //没什么解释  
	                                                lstImageItem,//数据来源   
	                                                R.layout.gridview_item,//night_item的XML实现  
	                                                  
	                                                //动态数组与ImageItem对应的子项          
	                                                new String[] {"ItemText"},   
	                                                  
	                                                //ImageItem的XML文件里面的一个ImageView,两个TextView ID  
	                                                new int[] {R.id.ItemText});  
	      //添加并且显示  
	      gridView.setAdapter(saImageItems);  
	}
	private void addTwoClassify(int i){

        gridView=new MyGridView(PorterDuffActivity.this);//注意这里使用的是MyGridView,如果使用GridView的话,只会显示一行多一点,第二行显示不完全,使用MyGridView的话,能够完全显示出来。commend by danielinbiti
        gridView.setVerticalSpacing(10);
        gridView.setHorizontalSpacing(15);
        gridView.setNumColumns(3);
        
        this.makeGridView(i);


        LinearLayout ll_two=new LinearLayout(PorterDuffActivity.this);
        ll_two.setPadding(10, 0, 0, 0);
        ll_two.addView(gridView,
                new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        
        ll.addView(ll_two, new LinearLayout.LayoutParams( 
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); 

    }
}

4、MyGridView代码

public class MyGridView extends GridView{
	 private boolean needScrollBar = false;   //设置是否有ScrollBar,当要在ScollView中显示时,应当设置为false。 否则为 true  
	    public MyGridView(Context context) {   
	        super(context);   
	    }   
	    public MyGridView(Context context, AttributeSet attrs) {   
	        super(context, attrs);   
	    }   
	    public MyGridView(Context context, AttributeSet attrs, int defStyle) {   
	        super(context, attrs, defStyle);   
	    }   
	    
	    @Override   
	    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {   
	        if (!needScrollBar) {   
	            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);   
	            super.onMeasure(widthMeasureSpec, expandSpec);   
	        } else {   
	            super.onMeasure(widthMeasureSpec, heightMeasureSpec);   
	        }   
	    }   
}


总结:

因为ScrollView和GridView有布局上的冲突,如果外层嵌套了ScrollView,则GridView如果不是指定固定高度,则无法显示完全。ListView也有该问题。

但其实针对这到题来说,我觉得使用LinearLayout等分方式的布局也是可以的,垂直布局往下添加就可以了,这样避免了与ScrollView的冲突。但主要因为GridView是封装好的组件,所以使用了GridView能够简化一部分工作,但也增加了布局刷新的负担(虽然一般可以不考虑)

你可能感兴趣的:(android)