列表嵌套滚动及显示问题

2019-09-30  本文已影响0人  名字不想带英文

列表嵌套滚动及显示问题
ScrollView嵌套ListView(GridView,ExpandableListView相同)时ListView一般都会显示不全,需要自定义ListView。

public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs,
                      int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    /**
     * 重写该方法,达到使ListView适应ScrollView的效果
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

可以看到,关键就是重写onMeasure。

而且在某些情况下会有滚动冲突的情况,这时可以在ListView的xml中添加android:descendantFocusability="blocksDescendants"

滚动加载更多
ScrollView上滑加载更多一般用到setOnTouchListener(会报警告,某些控件直接用setOnTouchListener可能还会影响点击事件响应,这时可以在方法名顶部加入@SuppressLint("ClickableViewAccessibility"))

slv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (slv.getScrollY() != 0) {
                    if (!flag) {
                        flag = true;
                        reTop.setBackgroundColor(Color.parseColor("#00bf9f"));
                    }
                } else {
                    flag = false;
                    reTop.setBackground(null);
                }
                if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    if (slv.getChildAt(0).getHeight() - slv.getHeight()
                            == slv.getScrollY()) {
                        getAnswerList(list_category.get(adapter_category.getSelect()).getId());//上拉加载更多
                    }
                }
                return false;
            }
        });

ListView,ExpandableListView用的setOnScrollListener

lvOrder.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                        if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
                            getList();//上拉加载更多
                        }
                        break;
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });

RecyclerView用的addOnScrollListener

rlv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (!rlv.canScrollVertically(-1)) {
                    LogUtil.i("滑动到顶部");
                }
                if (!rlv.canScrollVertically(1)) {
                    //系统已经自动帮我们弄了只回调一次
                    if (rlvLDInterface != null)
                        rlvLDInterface.loadMore();
                    LogUtil.i("滑动到底部");
                }
            }
        });
上一篇下一篇

猜你喜欢

热点阅读