单选 RecyclerView TextView

Single Selection RecyclerView TextView

我有一个 RecyclerView 显示来自 Firestore 的项目。

我所做的工作是当一个项目被点击时,它会被添加到 firestore 并且它的背景会变成红色。

但我想要的是,当单击另一个文本时,应取消选择该项目并将其背景恢复为默认值。发生的情况是该项目仅从 firestore 中删除。只能选择 ONE 项并将其添加到 firestore。

我搜索了我在 Whosebug 上找到的所有内容,但没有找到我想要的内容。

这是我的代码:

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();

                            }

                        }

                    }
                });

            }
        });

有什么帮助吗?如果您想查看其他一些代码,我会 post 它。提前致谢。

小编辑:

如何将其设为必填字段,以便可以点击添加到购物车按钮?

我将向您展示如何使用一个简单的示例来显示字符串列表来实现您正在寻找的内容。

我在 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。我已经定义了一个全局变量来保存当前 selected 项目位置。每次单击视图时,我都会更改 selected 项目位置并将更改通知适配器,以便它可以使用更改更新其视图。 OnBindViewHolder 方法我将背景颜色更改为 select 颜色,如果该位置当前是 selected 位置,如果不是,则更改为黑色。

在activity中我使用了这样的适配器,

        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);

我希望你能看看这个并根据你的代码调整它的完成方式。