您的位置:首页 > 移动开发 > Android开发

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

2015-02-02 10:01 543 查看
转载自:http://www.2cto.com/kf/201210/159540.html

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

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息