যখন আমি নেস্টডস্ক্রোলভিউয়ের মধ্যে একটি পুনর্ব্যবহারযোগ্য ভিউ যুক্ত করি তখন আমি একটি অদ্ভুত স্ক্রোলিং আচরণ পাচ্ছি।
যা ঘটে তা হ'ল যখনই স্ক্রোলভিউ স্ক্রিনে প্রদর্শিত হতে পারে তার চেয়েও বেশি সারি দেখায়, ক্রিয়াকলাপটি শুরু হওয়ার সাথে সাথে নেস্টডস্ক্রোলভিউ শীর্ষ থেকে অফসেট দিয়ে শুরু হয় (চিত্র 1)। যদি স্ক্রোল ভিউতে কয়েকটি আইটেম থাকে যাতে সেগুলি একবারে দেখা যায়, এটি ঘটে না (চিত্র 2)।
আমি সমর্থন লাইব্রেরির 23.2.0 সংস্করণ ব্যবহার করছি।
চিত্র 1 : ভুল - উপরে থেকে অফসেট দিয়ে শুরু হয়
চিত্র 2 : সংশোধন - পুনর্ব্যবহারযোগ্য দৃশ্যে কয়েকটি আইটেম
আমি আমার লেআউট কোড নীচে আটকানো করছি:
<?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>
আমি কিছু অনুপস্থিত করছি? কীভাবে এটি ঠিক করা যায় কারও কি ধারণা আছে?
আপডেট 1
আমার ক্রিয়াকলাপ সূচনা করার সময় আমি যদি নিম্নলিখিত কোডটি রাখি তবে এটি সঠিকভাবে কাজ করে:
sv.post(new Runnable() {
@Override
public void run() {
sv.scrollTo(0,0);
}
});
যেখানে এসভি হ'ল নেস্টেডস্ক্রোলভিউর একটি উল্লেখ, তবে এটি বেশ হ্যাকের মতো দেখাচ্ছে।
আপডেট 2
অনুরোধ হিসাবে, এখানে আমার অ্যাডাপ্টার কোড:
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());
}
}
এবং এখানে আমার ভিউহোল্ডার:
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);
}
}
এবং এখানে পুনর্ব্যবহারযোগ্য ভিউয়ের প্রতিটি আইটেমের বিন্যাস (এটি ঠিক android.R.layout.simple_spinner_item
- এই স্ক্রিনটি কেবল এই বাগের উদাহরণ দেখানোর জন্য):
<?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"
জন্যRecyclerView
? স্মিথটি স্পষ্টত "আপনার লেআউটটি নীচে যেতে বাধ্য করছে ... (আপনার যখন 1295 আইটেম রয়েছে তখন এটি শুরু হয়? নীচে বা প্রথম স্ক্রিনের মতো কেবল ছোট শীর্ষ অফসেট)