我有下一个问题。
我正在尝试在NestedScrollView中获取第一个可见项。实际上,第一个也是唯一一个里面的视图是LinearLayout(因为滚动视图只能容纳一个直接子项),但我正在尝试在其中获得第一个可见项。我经常搜索但没有成功。
通过这种方法,我想避免在另一个RecyclerView中使用RecyclerView。我发现这是一种不好的做法。
P.S。我不想使用ListView或RecyclerView
提前致谢
答案 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。