获取NestedScrollView内的第一个可见视图

时间:2017-07-10 09:54:49

标签: android android-nestedscrollview

我有下一个问题。

我正在尝试在NestedScrollView中获取第一个可见项。实际上,第一个也是唯一一个里面的视图是LinearLayout(因为滚动视图只能容纳一个直接子项),但我正在尝试在其中获得第一个可见项。我经常搜索但没有成功。

通过这种方法,我想避免在另一个RecyclerView中使用RecyclerView。我发现这是一种不好的做法。

P.S。我不想使用ListView或RecyclerView

提前致谢

3 个答案:

答案 0 :(得分:3)

好的,我找到了解决方案:

        final Rect scrollBounds = new Rect();
        questionAndAnswerScroll.getHitRect(scrollBounds);
        questionAndAnswerScroll.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                for (int i = 0; i < questionAndAnswerHolder.getChildCount(); i++) {
                    View childView = questionAndAnswerHolder.getChildAt(i);
                    if (childView != null) {
                        if (childView.getLocalVisibleRect(scrollBounds)) {
                            //Here is the position of first visible view
                            positionToScroll = i;
                            break;
                        }
                    }
                }
            }
        });

答案 1 :(得分:1)

用于此布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nestedScrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/ly"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_1"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_2" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_3" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_4" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_5" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_6" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_7" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_8" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_9" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:text="text_10" />


    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

并使用此代码

  public class MainActivity extends AppCompatActivity {

    NestedScrollView nestedScrollView;
    LinearLayout linearLayout;

    ArrayList<Integer> childrenY = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //find view
        nestedScrollView = (NestedScrollView) findViewById(R.id.nestedScrollView);
        linearLayout = (LinearLayout) nestedScrollView.getChildAt(0);


        //get Y Children and save
        for (int i = 0; i < linearLayout.getChildCount(); i++) {

            int childrenY = 0;
            for (int j = 0; j < i; j++) {
                TextView tv = (TextView) linearLayout.getChildAt(j);
                Log.i("--------", tv.getText().toString());
                childrenY += tv.getLayoutParams().height;
            }
            this.childrenY.add(childrenY);
        }

        //add Scroll Change Listener
        nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

                for (int i = 0; i < childrenY.size(); i++) {
                    if (scrollY < childrenY.get(i)) {
                        Log.i("++++++++++", ((TextView) linearLayout.getChildAt(i-1)).getText().toString());
                        return;
                    }
                }
            }
        });
    }
}

答案 2 :(得分:0)

如果要在NestedScrollView的内部LinearLayout中找到第一个可见项,可以试试这个:

    if(nsv.getChildCount() > 0) {
        ViewGroup vg = (ViewGroup) nsv.getChildAt(0);
        for (int i = 0; i < vg.getChildCount(); i++) {
            if(vg.getChildAt(i).getVisibility()==View.VISIBLE)
                return vg.getChildAt(i);
        }
    }

    return null;

其中nsv是您的NestedScrollView。