Один выбор RecyclerView TextView - PullRequest
1 голос
/ 09 марта 2019

У меня есть RecyclerView, который отображает элементы из Firestore.

Что я сделал и работает, так это то, что при нажатии на элемент он добавляется в пожарный магазин, а его фон меняет цвет на красный.

Но я хочу, чтобы при щелчке по другому тексту этот элемент отменялся, а его фон возвращался к значению по умолчанию. То, что происходит, - то, что пункт только удален из пожарного магазина. Только ONE предмет должен быть выбран и добавлен в пожарный.

Я искал все, что нашел в stackoverflow, и не нашел того, что хотел.

Это мой код:

holder.sizeView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                firebaseFirestore.collection("Shopping Cart").document(userID).collection("Products").document(productID).collection("Size").document("Product Size").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {

                        if (task.isSuccessful()) {

                            DocumentSnapshot documentSnapshot = task.getResult();

                            if (documentSnapshot.exists()) {

                                firebaseFirestore.collection("Shopping Cart").document(userID).collection("Products").document(productID).collection("Size").document("Product Size").delete();

                                holder.sizeView.setBackgroundResource(R.drawable.size_text_background);

                                Toast.makeText(context, "Size Removed", Toast.LENGTH_SHORT).show();

                            } else {

                                Map<String, String> productSizeMap = new HashMap<>();
                                productSizeMap.put("size", sizeID);

                                firebaseFirestore.collection("Shopping Cart").document(userID).collection("Products").document(productID).collection("Size").document("Product Size").set(productSizeMap);

                                holder.sizeView.setBackgroundResource(R.drawable.size_text_background_clicked);

                                Toast.makeText(context, "Size Added", Toast.LENGTH_SHORT).show();

                            }

                        }

                    }
                });

            }
        });

Любая помощь, пожалуйста? Если есть какой-то другой код, который вы хотите увидеть, я опубликую его. И заранее спасибо.

Малое редактирование:

Как сделать это поле обязательным, чтобы кнопка «Добавить в корзину» могла быть нажата?

1 Ответ

0 голосов
/ 09 марта 2019

Я покажу вам, как добиться того, что вы ищете, на простом примере, чтобы показать список строк.

Мой взгляд на представление элемента в представлении RecyclerView будет test_cell_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/holder_background"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"/>

</LinearLayout>

И я создал адаптер, расширяющий RecyclerView.Adapter

import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;


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

    private int selectedPos = 0;

    private OnItemClickListener listener;

    public interface OnItemClickListener {
        void onItemClick(View viewItem, int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        LinearLayout background;
        TextView itemText;

        ViewHolder(final View viewItem) {
            super(viewItem);
            background = (LinearLayout) viewItem.findViewById(R.id.holder_background);
            itemText = (TextView) viewItem.findViewById(R.id.item_text);

            viewItem.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Triggers click upwards to the adapter on click
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(viewItem, position);
                            notifyItemChanged(selectedPos);
                            selectedPos =getAdapterPosition();
                            notifyItemChanged(selectedPos);
                        }
                    }
                }
            });
        }
        public void changeToSelect(int colorBackground) {
            background.setBackgroundColor(colorBackground);
        }
    }

    private List<String> list;
    private Context context;

    public TestAdapter(Context context, List<String> list) {
        this.list = list;
        this.context= context;
    }

    @Override
    public TestAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View itemView = inflater.inflate(R.layout.test_cell_item, parent, false);
        ViewHolder itemViewHolder = new ViewHolder(itemView);
        return itemViewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.changeToSelect(selectedPos == position ? Color.parseColor("#ca3854") : Color.BLACK);
        TextView filterText = holder.itemText;
        filterText.setTextSize(30);
        filterText.setText(list.get(position));
    }

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

Здесь вы можете видеть, что я создал интерфейс для использования в качестве OnItemClickListener.Я определил глобальную переменную для хранения выбранной позиции элемента.При каждом щелчке по представлению я изменяю позицию выбранного элемента и уведомляю об изменениях в адаптере, чтобы он мог обновлять свой вид с изменениями.OnBindViewHolder метод я меняю цвет фона, чтобы выбрать цвет, если позиция в настоящее время выбрана позиция и черный, если нет.

В деятельности я использовал адаптер, как это,

        RecyclerView view = findViewById(R.id.view);
        ArrayList<String> list = new ArrayList<>();
        for(int i = 100; i < 150; i++) {
            list.add(Integer.toString(i));
        }
        TestAdapter adaptor = new TestAdapter(this, list);
        adaptor.setOnItemClickListener(new TestAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View viewItem, int position) {
                //Your item click code
            }
        });
        view.setAdapter(adaptor);
        LinearLayoutManager liveImageLayoutManager = new LinearLayoutManager(getApplicationContext());
        liveImageLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        view.setLayoutManager(liveImageLayoutManager);

Я надеюсь,Вы можете взглянуть на это и адаптировать, как это делается в вашем коде.

...