首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。