我在一个活动中有一个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”)可以正常工作。
答案 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并将其优化为同一对象。