Вы можете использовать Linearlayout
Вместо RelaytiveLayout
в качестве дочернего элемента HorizontalScrollView
.Например:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
<LinearLayout
android:id="@+id/layLandmarks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp" />
</HorizontalScrollView>
</RelativeLayout>
Примечание. Вы также можете использовать пользовательский макет для раздувания в представлениях в LinearLayout
для повышения производительности в случае вложенных макетов.(Я использовал TextView
, а не Custom Layout здесь)
В своей деятельности используйте что-то вроде этого:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final HorizontalScrollView horizontalScrollView = findViewById(R.id.horizontalScrollView);
TextView iv;
final LinearLayout layLandmarks = findViewById(R.id.layLandmarks);
for (int j = 0; j < 10; j++) {
iv = new TextView(this);
iv.setId(j);
iv.setText("TEXT " + j);
iv.setPadding(20, 20, 20, 20);
layLandmarks.addView(iv);
}
horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
int firstVisibleItemIndex = getFirstVisibleItem(layLandmarks, horizontalScrollView);
Log.e("ItemIndex >>", firstVisibleItemIndex + "");
}
});
}
Теперь используйте код ниже.Это модифицированная версия @ Phan Van Linh Ответ.
private int getFirstVisibleItem(LinearLayout linearLayout, HorizontalScrollView horizontalScrollView) {
for (int i = 0; i < linearLayout.getChildCount(); i++) {
View view = linearLayout.getChildAt(i);
if (view.getX() + view.getWidth() >= horizontalScrollView.getScrollX()) {
return i; // if you want to receive the position, return i here
}
}
return 0;
}
Надеюсь, это решит вашу проблему.:)