scrollview嵌套listview,gridview时使用自定义listview或gridview

来源:互联网 发布:淘宝口令转换器 编辑:程序博客网 时间:2024/05/06 18:32


scrollview嵌套listview,gridview时,listview的apapter的getview方法会被调用多次,如果getview中存在图片下载的逻辑则耗费流量,因此写一个简单的自定义view来代替。





public class LinearGridView extends LinearLayout {

 private Context mContext;
 private int mostColomn = 4;
 private BaseAdapter adapter;
 private OnItemClickListener listener;
 private List<View> viewList;
 public final int INVALITE = -1;
 private int spaceEnd = INVALITE;
 private int spaceWidth = INVALITE;// 每项之间的间隔
 private DataSetObserver observer = new DataSetObserver() {

  public void onChanged() {

   if( adapter != null ) {
    LinearGridView.this.removeAllViews();
    initView();
   }
  };
 };
 private static final String tag = "LinearGridView";


 /**
  * @param 设置每一项之间的间隔大小
  *            ,在setadapter之前调用生效
  */
 public void setSpaceWidth( int spaceWidth ) {

  this.spaceWidth = spaceWidth;
 }


 /**
  * addSpaceView 添加每一项之间的间隔 void
  *
  * @exception
  * @since 3.0
  */
 private void addSpaceView() {

  View spaceView = new View( mContext );
  spaceView.setBackgroundColor( getResources().getColor( android.R.color.transparent ) );
  addView( spaceView, 1 );
  LayoutParams mLayoutParams = ( LayoutParams )spaceView.getLayoutParams();
  mLayoutParams.width = getResources().getDimensionPixelSize( spaceWidth );
  mLayoutParams.height = LayoutParams.WRAP_CONTENT;
 }


 /**
  * @param 是否使用空白填充gridview
  */
 public void setSpaceEnd( int spaceEnd ) {

  this.spaceEnd = spaceEnd;
 }


 /**
  * mostColomn
  *
  * @return the mostColomn
  * @since 3.0
  */

 public int getMostColomn() {

  return mostColomn;
 }


 /**
  * @param mostColomn
  *            the mostColomn to set
  */
 public void setMostColomn( int mostColomn ) {

  this.mostColomn = mostColomn;
 }


 public LinearGridView( Context context, AttributeSet attrs ) {

  super( context, attrs );
  mContext = context;
  viewList = new ArrayList<View>();
 }


 public LinearGridView( Context context ) {

  super( context );
  mContext = context;
  viewList = new ArrayList<View>();
 }


 public void setAdapter( BaseAdapter myAdapter ) {

  adapter = myAdapter;
  myAdapter.registerDataSetObserver( observer );
  initView();
 }


 void initView() {

  int weightSum = 0;
  setOrientation( LinearLayout.HORIZONTAL );
  int count = adapter.getCount();

  LinearLayout[] mLinearLayouts = null;
  weightSum = mostColomn;
  setWeightSum( weightSum );
  // if( count > mostColomn ) {
  // setWeightSum( mostColomn );
  // weightSum = mostColomn;
  //
  // } else {
  // setWeightSum( count );
  // weightSum = count;
  // }
  if( weightSum == 0 ) {
   return;
  }

  mLinearLayouts = new LinearLayout[ weightSum ];
  for( int i = 0; i < weightSum; i++ ) {
   LinearLayout mLinearLayout = new LinearLayout( mContext );
   mLinearLayout.setOrientation( LinearLayout.VERTICAL );
   // mLinearLayout.setLayoutParams( new LayoutParams( 0, 0 ) );
   addView( mLinearLayout );
   LayoutParams params = ( LayoutParams )mLinearLayout.getLayoutParams();
   params.width = 0;
   params.weight = 1;
   params.height = LayoutParams.WRAP_CONTENT;
   mLinearLayouts[ i ] = mLinearLayout;
   if( spaceWidth != INVALITE ) {
    if( i != weightSum - 1 ) {
     addSpaceView();
    }
   }
  }

  for( int i = 0; i < count; i++ ) {
   View childView = adapter.getView( i, null, mLinearLayouts[ i % weightSum ] );
   mLinearLayouts[ i % weightSum ].addView( childView );
   viewList.add( childView );
  }

  if( spaceEnd != INVALITE ) {
   LayoutInflater inflater = null;
   int spaceCount = mostColomn - count % mostColomn;
   if( spaceCount > mostColomn - 1 ) {
    spaceCount = 0;
   }
   if( spaceCount != 0 ) {
    inflater = LayoutInflater.from( mContext );
   }
   if( inflater != null ) {
    for( int i = 0; i < spaceCount; i++ ) {
     View spaceView = inflater.inflate( spaceEnd, null );
     mLinearLayouts[ ( mostColomn - spaceCount + i ) % weightSum ].addView( spaceView );
    }
   }
  }

  initAction();
 }


 private void initAction() {

  setOnItemClickListener( listener );
 }


 public void setOnItemClickListener( final OnItemClickListener onItemClickListener ) {

  if( onItemClickListener == null ) {
   return;
  }
  listener = onItemClickListener;
  if( adapter != null ) {
   for( int i = 0; i < adapter.getCount(); i++ ) {
    final int position = i;
    try {
     final View childView = viewList.get( i );
     childView.setOnClickListener( new OnClickListener() {

      @Override
      public void onClick( View v ) {

       onItemClickListener.onItemClick( null, childView, position, 0 );
      }
     } );
    } catch( Exception e ) {
    }
   }
  }
 }

0 0
原创粉丝点击