单击侦听器以查看RecyclerView中的项目,仅在单击两次时有效

时间:2018-10-18 19:08:17

标签: java android android-recyclerview

我在一个活动中有一个RecyclerView,该活动显示了一些产品,其工作方式类似于购物车活动。作为列表项,我使用2个文本视图和一个图像按钮。 对于按钮,我已经为该图像按钮实现了点击侦听器。但是,只要在特定列表项中第一次点击该按钮,就需要两次单击。我也尝试过使用ontouchlistener。请帮助我解决问题。这是我的适配器和xml的代码。

适配器

private class servicesAdapter extends RecyclerView.Adapter<servicesAdapter.servicesViewHolder>{

    private ArrayList<Pair<String,String>> pairArrayList;
    Context context;

    public servicesAdapter(ArrayList<Pair<String, String>> pairArrayList, Context context) {
        this.pairArrayList = pairArrayList;
        this.context = context;
        selectedList=new ArrayList<>();
    }

    @NonNull
    @Override
    public servicesViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.garage_service_list_item,viewGroup,false);
        return new servicesViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final servicesViewHolder servicesViewHolder, int i) {
        Pair<String,String> current=pairArrayList.get(i);
        servicesViewHolder.Service.setText(current.first);
        final int j=i;
        servicesViewHolder.ServicePrice.setText(current.second);
        servicesViewHolder.imageButton.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onClick(View v) {
                if(servicesViewHolder.imageButton.getTag()=="Add") {
                    selectedList.add(pairArrayList.get(j));
                    servicesViewHolder.imageButton.setBackground(getDrawable(R.drawable.ic_remove));
                    servicesViewHolder.imageButton.setTag("Sub");
                    if(selectedList.size()>0){
                        myMenu.findItem(R.id.shoppingCart).setIcon(R.drawable.ic_add_shopping_cart);
                        itemsInCart=true;
                        Log.d("GetService", "onAdd: menu= "+myMenu.findItem(R.id.shoppingCart).getIcon());
                    }
                }else {
                    servicesViewHolder.imageButton.setTag("Add");
                    servicesViewHolder.imageButton.setBackground(getDrawable(R.drawable.ic_add));
                    selectedList.remove(pairArrayList.get(j));
                    if(selectedList.size()<=0){
                        myMenu.findItem(R.id.shoppingCart).setIcon(R.drawable.ic_shopping_cart);
                        Log.d("GetService", "onSub: menu= "+myMenu.findItem(R.id.shoppingCart).getTitle());
                        itemsInCart=false;
                    }
                }
            }
        });
    }

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

    public class servicesViewHolder extends RecyclerView.ViewHolder{
        TextView Service;
        TextView ServicePrice;
        ImageButton imageButton;
        public servicesViewHolder(@NonNull View itemView) {
            super(itemView);
            Service=(TextView)itemView.findViewById(R.id.service);
            ServicePrice=(TextView)itemView.findViewById(R.id.service_price);
            imageButton=(ImageButton) itemView.findViewById(R.id.imageView);
        }
    }
}

listItem

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">

<TextView
    android:id="@+id/service"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="28dp"
    android:layout_marginTop="8dp"
    android:text="Service"
    android:textSize="20sp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/service_price"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:text="Price"
    android:textSize="20sp"
    app:layout_constraintEnd_toStartOf="@+id/imageView"
    app:layout_constraintStart_toEndOf="@+id/service"
    app:layout_constraintTop_toTopOf="parent" />

<ImageButton
    android:id="@+id/imageView"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:clickable="true"
    android:layout_marginTop="0dp"
    android:tag="Add"
    android:layout_marginEnd="8dp"
    android:background="@drawable/ic_add"
    android:contentDescription="Add To Cart"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:focusable="true" />
</android.support.constraint.ConstraintLayout>

更新

登录后,我意识到每次都按下了该按钮,但是检查 getTag()==“ Add” 的代码无法正常工作。相反,使用 getTag()。equals(“ Add”)可以正常工作。

1 个答案:

答案 0 :(得分:0)

这是String相等和比较的问题,由于Java的怪癖而变得不那么明显。本质上,Java编译器“足够聪明”,可以在代码中找到String文字,并使它们全部引用相同的String对象实例(只要它们具有相同的文本)。考虑以下几行:

if(servicesViewHolder.imageButton.getTag()=="Add") {
servicesViewHolder.imageButton.setTag("Add");

编译器将同时看到两个"Add"字符串文字,并使它们成为同一对象。但是不能对您在XML中设置的标签执行此操作:

android:tag="Add"

这是一个不同的对象。这意味着您第一次单击它,是xml-“添加” != java-“添加” ...,但是从那时起,是java-“添加” == java-“添加”。

您可以通过始终确保使用equals()而不是==进行字符串比较来解决此问题。


考虑此程序:

public static void main(String[] args) {
    String a = "hello";
    String b = "hello";
    String c = args[0];

    System.out.println(a == b);
    System.out.println(a == c);
}

如果我通过键入来运行此程序

java MyTest hello

我将看到以下输出:

true
false

即使所有三个字符串都是“ hello”。这是由于我上面提到的同一件事:不能找到不仅仅是String文字的String并将其优化为同一对象。