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 ) {
}
}
}
}