ListView滚动条监听判断滚动到底部还是顶部 lv.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (lv.getLastVisiblePosition() == (lv.getCount() - 1)) { } // 判断滚动到顶部 if(lv.getFirstVisiblePosition() == 0){ } break; } } @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount ) { // 滚动到底部 } else } }; ListView嵌套listview动态测量子view的高度 public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } /** * Created by ${Simon} on 2016/6/14 0014. * 解决嵌套的子listview无法滚动 */ public class InnerListView extends ListView { private Boolean bottom=true; public InnerListView(Context context) { super(context); } public InnerListView(Context context, AttributeSet attrs) { super(context, attrs); } public InnerListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } //判断listview是否滚动到最后一条 public void setScrollBottom(Boolean b) { this.bottom = b; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { // 当手指触摸listview时,让父控件交出ontouch权限,不能滚动 case MotionEvent.ACTION_DOWN: if (bottom) { setParentScrollAble(true); } else { setParentScrollAble(false); } case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: // 当手指松开时,让父控件重新获取onTouch权限 setParentScrollAble(true); break; } return super.onInterceptTouchEvent(ev); } // 设置父控件是否可以获取到触摸处理权限 private void setParentScrollAble(boolean flag) { getParent().requestDisallowInterceptTouchEvent(!flag); } }ListView嵌套checkbox时注意事项
因为checkbox的优先级默认是大于listview的item的,所以在单击item的时候会出现无反映现象,所以在item中含有checkbox的时候要默认设置checkbox的属性:<CheckBox android:layout_width="40dp" android:layout_height="match_parent" android:focusable="false" android:focusableInTouchMode="true"/>
因为listview的适配器多数都会使用继承的BaseAdapter,而getView这个复用的属性会让checkbox出现混乱,所以我们要设置一个标记来记录已选择的checkbox:Map<Integer, Boolean> isCheckMap = new HashMap<Integer, Boolean>();//标记checkboxmHolder.cb_shopping.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { //将选中的放入hashmap中 isCheckMap.put(position, isChecked); } else { //取消选中的则剔除 isCheckMap.remove(position); } } }); //判断当前checkbox是否选中 if (isCheckMap != null && isCheckMap.containsKey(position)) { mHolder.cb_shopping.setChecked(isCheckMap.get(position)); } else { mHolder.cb_shopping.setChecked(false); }当ListView中嵌套了一个Button或者ImageButton时,会让ListView的OnItemClickListener失去效果。
ListView中嵌套一个ListView(ListView嵌套ListView),结果父View的OnItemClick事件不触发了
1. 在子ListView的XML配置中,最顶层的Layout中增加属性:
android:descendantFocusability="blocksDescendants"
2. 设置ListView的setFocusable为false就行了。