Listview

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>();//标记checkbox

mHolder.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就行了。


































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值