Tôi nhận được một hành vi cuộn kỳ lạ khi tôi thêm RecyclerView bên trong NestedScrollView.
Điều xảy ra là bất cứ khi nào scrollview có nhiều hàng hơn mức có thể hiển thị trên màn hình, ngay khi hoạt động được khởi chạy, NestedScrollView sẽ bắt đầu với phần bù từ trên cùng (hình 1). Nếu có một vài mục trong chế độ xem cuộn để tất cả chúng có thể được hiển thị cùng một lúc, điều này không xảy ra (hình 2).
Tôi đang sử dụng phiên bản 23.2.0 của thư viện hỗ trợ.
Hình 1 : SAI - bắt đầu với phần bù từ trên xuống
Hình 2 : ĐÚNG - một vài mục trong chế độ xem tái chế
Tôi dán bên dưới mã bố trí của tôi:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Title:"
style="@style/TextAppearance.AppCompat.Caption"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/bodyPadding"
style="@style/TextAppearance.AppCompat.Body1"
android:text="Neque porro quisquam est qui dolorem ipsum"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Subtitle:"
style="@style/TextAppearance.AppCompat.Caption"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextAppearance.AppCompat.Body1"
android:padding="@dimen/bodyPadding"
android:text="Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
Tui bỏ lỡ điều gì vậy? Liệu có ai đó có bất cứ ý kiến nào để sửa thứ này?
Cập nhật 1
Nó hoạt động chính xác nếu tôi đặt mã sau đây khi khởi tạo Hoạt động của mình:
sv.post(new Runnable() {
@Override
public void run() {
sv.scrollTo(0,0);
}
});
Trong đó sv là một tham chiếu đến NestedScrollView, tuy nhiên có vẻ như nó khá là hack.
Cập nhật 2
Theo yêu cầu, đây là mã bộ điều hợp của tôi:
public abstract class ArrayAdapter<T, VH extends RecyclerView.ViewHolder>
extends RecyclerView.Adapter<VH> {
private List<T> mObjects;
public ArrayAdapter(final List<T> objects) {
mObjects = objects;
}
/**
* Adds the specified object at the end of the array.
*
* @param object The object to add at the end of the array.
*/
public void add(final T object) {
mObjects.add(object);
notifyItemInserted(getItemCount() - 1);
}
/**
* Remove all elements from the list.
*/
public void clear() {
final int size = getItemCount();
mObjects.clear();
notifyItemRangeRemoved(0, size);
}
@Override
public int getItemCount() {
return mObjects.size();
}
public T getItem(final int position) {
return mObjects.get(position);
}
public long getItemId(final int position) {
return position;
}
/**
* Returns the position of the specified item in the array.
*
* @param item The item to retrieve the position of.
* @return The position of the specified item.
*/
public int getPosition(final T item) {
return mObjects.indexOf(item);
}
/**
* Inserts the specified object at the specified index in the array.
*
* @param object The object to insert into the array.
* @param index The index at which the object must be inserted.
*/
public void insert(final T object, int index) {
mObjects.add(index, object);
notifyItemInserted(index);
}
/**
* Removes the specified object from the array.
*
* @param object The object to remove.
*/
public void remove(T object) {
final int position = getPosition(object);
mObjects.remove(object);
notifyItemRemoved(position);
}
/**
* Sorts the content of this adapter using the specified comparator.
*
* @param comparator The comparator used to sort the objects contained in this adapter.
*/
public void sort(Comparator<? super T> comparator) {
Collections.sort(mObjects, comparator);
notifyItemRangeChanged(0, getItemCount());
}
}
Và đây là ViewHolder của tôi:
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView txt;
public ViewHolder(View itemView) {
super(itemView);
txt = (TextView) itemView;
}
public void render(String text) {
txt.setText(text);
}
}
Và đây là cách bố trí của từng mục trong RecyclerView (chỉ là android.R.layout.simple_spinner_item
- màn hình này chỉ để hiển thị một ví dụ về lỗi này):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textAlignment="inherit"/>
LayoutManager
android:focusableInTouchMode="false"
choRecyclerView
? rõ ràng là "buộc bố cục của bạn phải xuống dưới ... (nơi nó bắt đầu khi bạn có 1295 vật phẩm? dưới cùng hoặc chỉ là phần bù nhỏ như màn hình đầu tiên)