Android ScrollView与ListView,GridView共存冲突解决方案

转载自:http://www.2cto.com/kf/201210/159540.html


ListView或者GridView嵌套在ScrollView中:嵌套使用时,会出现ListView/GridView有自己的滚动条,而ScrollView又有自己的滚动条。解决此问题的核心是:重写ListView/GridViewOnMesure方法。

MyGridView.java代码如下:
package com.csdn.blog.scrollview; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.GridView; 
 
public class MyGridView extends GridView{ 
    public MyGridView(Context context, AttributeSet attrs, intdefStyle) { 
        super(context, attrs,defStyle); 
    } 
    public MyGridView(Context context, AttributeSet attrs){ 
        super(context, attrs); 
    } 
    public MyGridView(Context context) { 
        super(context); 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, intheightMeasureSpec) { 
        int expandSpec =MeasureSpec.makeMeasureSpec(  
               Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec,expandSpec);  
    } 

main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"  
    android:background="#FFFFFF"> 
    <ScrollView 
       android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
        android:fadingEdgeLength="0dp" 
       android:scrollbars="none" 
       android:id="@+id/scroll"> 
        <LinearLayout 
           android:layout_height="fill_parent" 
           android:layout_width="fill_parent" 
           android:orientation="vertical"> 
           <ImageView 
               android:id="@+id/image" 
               android:layout_height="150dp" 
               android:layout_width="fill_parent" 
               android:padding="2dp" 
               android:scaleType="centerCrop" 
               android:src="@drawable/fruit" /> 
           <com.csdn.blog.scrollview.MyGridView 
               android:layout_marginTop="10dp" 
               android:id="@+id/grid" 
               android:layout_height="fill_parent" 
               android:layout_width="fill_parent" 
               android:fadingEdgeLength="0dp" 
               android:scrollbars="none" 
               android:numColumns="3" /> 
        </LinearLayout> 
    </ScrollView> 
</LinearLayout> 

 

主类主要就是GridVIew数据绑定。简单贴下代码:
package com.csdn.blog.scrollview; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.ScrollView; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.TextView; 
 
public class BlogScrollViewActivity extends Activity { 
    /** Called when the activity is first created. */ 
    MyGridView  grid; 
    ImageView image; 
    ScrollView scroll; 
    String[] texts=new String[]{"无线","通话设置","声音","显示","位置","应用","账户","隐私权","存储","语言","游戏","娱乐","电影","音乐","辅助功能","日期"}; 
    ArrayAdapter<String> adapter; 
    LinearLayout.LayoutParams lp; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        init(); 
    } 
    void init(){ 
       image=(ImageView)findViewById(R.id.image); 
       grid=(MyGridView)findViewById(R.id.grid); 
        grid.setAdapter(newGridAdapter(this)); 
       scroll=(ScrollView)findViewById(R.id.scroll); 
        scroll.requestChildFocus(image,null); 
    } 
    private class GridAdapter extends BaseAdapter{ 
        Activity context; 
        public GridAdapter(Activitycontext){ 
           this.context=context; 
        } 
        @Override 
        public int getCount() { 
            returntexts.length; 
        } 
        @Override 
        public Object getItem(int position){ 
            returnnull; 
        } 
        @Override 
        public long getItemId(int position){ 
            return 0; 
        } 
        @Override 
     public View getView(int position, View convertView,ViewGroup parent) { 
            ViewHolderholder=null; 
           if(convertView==null){ 
    convertView=context.getLayoutInflater().inflate(R.layout.item,null); 
               holder=new ViewHolder(); 
     holder.image=(ImageView)convertView.findViewById(R.id.grid_image); 
     holder.text=(TextView)convertView.findViewById(R.id.grid_text); 
               convertView.setTag(holder); 
            } 
            else{ 
               holder=(ViewHolder)convertView.getTag(); 
            } 
           holder.image.setImageResource(R.drawable.meinv); 
            holder.text.setText(texts[position]); 
            returnconvertView; 
        } 
        class ViewHolder { 
            ImageViewimage; 
            TextViewtext; 
        }  
    } 

 上述代码中  scroll.requestChildFocus(image, null); 此句主要是修复了程序进入时GridView会滑动到顶端的小bug。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值