Как предотвратить перемещение ScrollView вверх при выборе последнего элемента RecyclerView? - PullRequest
0 голосов
/ 08 января 2020

Я разрабатываю макет и у меня возникает проблема с ScrollView. Специально, у меня есть ScrollView и RecyclerView внутри этого ScrollView. Когда я выбираю элементы в последнем ряду RecyclerView, представление не остается в последнем ряду, оно перемещается вверх в верхний ряд. Например, мой взгляд имеет 4 строки. Когда я выбираю элемент в 4-й строке, вид автоматически перемещается до 3-й строки. Итак, как я могу предотвратить это, чтобы при выборе элементов в последнем ряду вид оставался, а не двигался вверх? Спасибо

Расположение:

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/selectPayment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginTop="20dp"
            android:text="@string/select_payment_method"
            android:textSize="@dimen/sp_20"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/choosePayment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textSize="@dimen/sp_16"
            android:text="@string/choose_payment_method"
            app:layout_constraintStart_toStartOf="@+id/selectPayment"
            app:layout_constraintTop_toBottomOf="@+id/selectPayment" />

        <ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginTop="@dimen/dp_30"
            android:layout_marginBottom="10dp"
            android:fadeScrollbars="false"
            app:layout_constraintBottom_toTopOf="@+id/continueButton"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/choosePayment">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/paymentMethodRV"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </ScrollView>

        <Button
            android:id="@+id/continueButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@string/continue_in_cap"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

Адаптер:

public class PaymentAdapter extends RecyclerView.Adapter<PaymentAdapter.ViewHolder> {

    private Context context;
    private List<CardItems> cardItemsList;
    private int rowIndex = -1;

    public PaymentAdapter(Context context, List<CardItems> cardItemsList) {
        this.context = context;
        this.cardItemsList = cardItemsList;          
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.payment_method_items, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.paymentImage.setImageResource(cardItemsList.get(position).getCardImage());
        holder.paymentTitle.setText(cardItemsList.get(position).getCardNumber());

        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(int position) {
                rowIndex = position;
                notifyDataSetChanged();
            }
        });

        //set highlight color when option is clicked
        if (rowIndex == position){
            holder.frameContainer.setBackgroundResource(R.drawable.green_rounded_button);

        }
        else {
            holder.frameContainer.setBackgroundResource(R.drawable.white_grey_rounded_button);

        }
    }

    @Override
    public int getItemCount() {
        return cardItemsList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        ImageView paymentImage;
        TextView paymentTitle;
        FrameLayout frameContainer;
        ItemClickListener itemClickListener;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            paymentImage = itemView.findViewById(R.id.paymentImage);
            paymentTitle = itemView.findViewById(R.id.paymentTitle);
            frameContainer = itemView.findViewById(R.id.frameContainer);
            itemView.setOnClickListener(this);
        }

        //handle click on each category
        @Override
        public void onClick(View view) {
            itemClickListener.onItemClick(getAdapterPosition());
            notifyDataSetChanged();
        }

        public void setItemClickListener(ItemClickListener listener){
            itemClickListener = listener;
        }

    }

    //for listening from holder
    public interface ItemClickListener{
        void onItemClick(int position);
    }

}
...