首页 > 代码库 > ScrollView中嵌套listview

ScrollView中嵌套listview

尽管网上有很多实现方式,但是还是想分享下,已做备忘,实现方式时,通过linearlayout来代替listview

废话少说,上代码:

ExpandListView.java:

public class ExpandListView extends LinearLayout implements OnClickListener {

	private ListAdapter adapter = null;
	private OnItemClickListener listener = null;
	private Drawable dividerDrawable = null;
	private int dividerHeight = 0;
	
	public ExpandListView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		initView(null);
	}
	public ExpandListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		initView(attrs);
	}
	
	public void initView(AttributeSet attrs) {
		setOrientation(VERTICAL); 
		if(attrs != null) {
			TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.ExpandListView);
			dividerDrawable = array.getDrawable(R.styleable.ExpandListView_divider_view);
			dividerHeight = array.getDimensionPixelSize(R.styleable.ExpandListView_divider_height, 0);
			array.recycle();
		}
	}
	
	/**
	 * 绑定数据
	 */
	public void bindData() {
		if(adapter == null) {
			Logger.e("adapter is null");
			return ;
		}
		View convertView = null;
		LayoutParams params = null;
		for(int i = 0; i < adapter.getCount(); i++) {
			//如果这儿不传this(parent)传null的话,adapter在inflate时,parent为null,这样convertView的LayoutParams为空(需要父控件进行测量)
			convertView = adapter.getView(i, null, this);
			if(convertView.getLayoutParams() == null) {
				params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
			} else {
				params = (LayoutParams) convertView.getLayoutParams();
			}
			convertView.setLayoutParams(params);
			convertView.setId(i);
			addDivider(i);
			if(listener != null) {
				convertView.setOnClickListener(this);
			}
 			addView(convertView);
		}
	}
	
	@SuppressWarnings("deprecation")
	public void addDivider(int position) {
		if((dividerDrawable != null || dividerHeight != 0) && position != 0) {
			//添加divider
			ImageView iv = new ImageView(getContext());
			LayoutParams params = null;
			if(dividerHeight != 0) {
				params = new LayoutParams(LayoutParams.MATCH_PARENT, dividerHeight);
			} else {
				params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
			}
			iv.setLayoutParams(params);
			iv.setBackgroundDrawable(dividerDrawable);
			addView(iv);
		} 
	}
	
	/**
	 * 设置adapter
	 * @param adapter
	 */
	public void setAdapter(ListAdapter adapter) {
		this.adapter = adapter;
		if(getChildCount() != 0) {
			removeAllViews();
		}
		bindData();
	}
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		listener.onItemClick(v, v.getId(), adapter);
	}
	
	public void setOnItemClickListener(OnItemClickListener listener) {
		this.listener = listener;
	}
	
	public interface OnItemClickListener {
		public void onItemClick(View convertView, int position, ListAdapter adapter);
	}
}

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="ExpandListView">
        <attr name="divider_view" format="reference" />
        <attr name="divider_height" format="dimension" />
    </declare-styleable>

</resources>
简单使用:

 <com.ydk.mikeadmin.view.ExpandListView
        android:id="@+id/part_one_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mike:divider_height="2dip" />

然后就直接在代码中,用ExpandListView.setAdapter设置下adapter就行了

额,就这么多...只是这里的convertView没有复用起来,暂时还没有想到什么方法去复用


ScrollView中嵌套listview