Android RecyclerView中的项目正在重复
我正在做一个Android项目,在这个项目中我使用了RecyclerView。“回收器”视图中的项目计数正确,但在某个时间间隔后,项目会重复。我已经在互联网上找到了解决方案,并尝试使用它们,但对我没有帮助 片段的Java代码如下:Android RecyclerView中的项目正在重复,android,android-recyclerview,Android,Android Recyclerview,我正在做一个Android项目,在这个项目中我使用了RecyclerView。“回收器”视图中的项目计数正确,但在某个时间间隔后,项目会重复。我已经在互联网上找到了解决方案,并尝试使用它们,但对我没有帮助 片段的Java代码如下: package com.example.laundry1app; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull;
package com.example.laundry1app;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Objects;
public class AllProductsFragment extends Fragment {
private ProgressBar progress;
private ArrayList<AllProductsData> data;
private TextView products;
private View view;
private RecyclerView recyclerView;
private FloatingActionButton add, cart;
private boolean flag;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_all_products, container, false);
progress = view.findViewById(R.id.progress);
progress.setVisibility(View.VISIBLE);
add = view.findViewById(R.id.add);
cart = view.findViewById(R.id.cart);
if (FirebaseAuth.getInstance().getCurrentUser() != null) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("admins");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (Objects.equals(snapshot.child("email").getValue(String.class), FirebaseAuth.getInstance().getCurrentUser().getEmail())) {
flag = true;
add.show();
add.setEnabled(true);
cart.hide();
cart.setEnabled(false);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getFragmentManager() != null) {
startActivity(new Intent(getContext(), AddProductActivity.class));
Objects.requireNonNull(getActivity()).finish();
}
}
});
break;
}
}
if (!flag) {
add.hide();
add.setEnabled(false);
cart.show();
cart.setEnabled(true);
cart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getContext(), CartActivity.class));
Objects.requireNonNull(getActivity()).finish();
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
products = view.findViewById(R.id.products);
data = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("products");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
data.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
data.add(new AllProductsData(snapshot.child("english").getValue(String.class), snapshot.child("url").getValue(String.class)));
}
progress.setVisibility(View.GONE);
if (data.isEmpty()) {
products.setVisibility(View.VISIBLE);
} else {
products.setVisibility(View.GONE);
}//
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(new AllProductsAdapter(data));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return view;
}
}
适配器的Java代码如下:
package com.example.laundry1app;
import android.annotation.SuppressLint;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Objects;
class AllProductsAdapter extends RecyclerView.Adapter<com.example.laundry1app.AllProductsAdapter.ViewHolder> {
private ArrayList<AllProductsData> data;
private DatabaseReference reference, databaseReference;
private boolean flag;
private Double p;
AllProductsAdapter(ArrayList<AllProductsData> data) {
setHasStableIds(true);
this.data = data;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_products, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, @SuppressLint("RecyclerView") final int i) {
viewHolder.english.setText(data.get(i).getEnglish());
viewHolder.quantity.setText(viewHolder.quantity.getText().toString());
GlideApp.with(viewHolder.image.getContext()).load(data.get(i).getUrl()).into(viewHolder.image);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(viewHolder.spinner.getContext(),R.array.Services, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
viewHolder.spinner.setAdapter(adapter);
if (FirebaseAuth.getInstance().getCurrentUser() != null) {
reference = FirebaseDatabase.getInstance().getReference("admins");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (Objects.equals(snapshot.child("email").getValue(String.class), FirebaseAuth.getInstance().getCurrentUser().getEmail())) {
flag = true;
viewHolder.add.setEnabled(false);
viewHolder.add.setVisibility(View.GONE);
viewHolder.quantity.setEnabled(false);
viewHolder.quantity.setVisibility(View.GONE);
viewHolder.spinner.setEnabled(false);
viewHolder.spinner.setVisibility(View.GONE);
break;
}
}
if (!flag) {
viewHolder.add.setEnabled(true);
viewHolder.add.setVisibility(View.VISIBLE);
reference = FirebaseDatabase.getInstance().getReference("users/" + FirebaseAuth.getInstance().getCurrentUser().getUid() + "/cart");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (Objects.equals(snapshot.child("english").getValue(), data.get(i).getEnglish()) && Objects.equals(snapshot.child("quantity").getValue(String.class), viewHolder.quantity.getText().toString())) {
viewHolder.add.setEnabled(false);
viewHolder.add.setText(R.string.added);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
viewHolder.add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewHolder.english.length() == 0 ) {
viewHolder.english.requestFocus();
viewHolder.english.setError("This Is A Required Field");
} else if (viewHolder.spinner.getSelectedItem() == "Wash" || viewHolder.spinner.getSelectedItem() == "Laundry" || viewHolder.spinner.getSelectedItem() == "Steam Press" || viewHolder.spinner.getSelectedItem() == "Wash + Steam Press"){
viewHolder.spinner.requestFocus();
Toast.makeText(viewHolder.spinner.getContext(), "Select a service", Toast.LENGTH_SHORT).show();
}else {
databaseReference = reference.push();
databaseReference.child("english").setValue(data.get(i).getEnglish());
databaseReference.child("quantity").setValue(viewHolder.quantity.getText().toString());
databaseReference.child("image").setValue(data.get(i).getUrl());
databaseReference.child("service").setValue(viewHolder.spinner.getSelectedItem().toString());
if (viewHolder.spinner.getSelectedItem().toString().equals("Wash")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 5;
} else if (viewHolder.spinner.getSelectedItem().toString().equals("Laundry")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 8;
} else if (viewHolder.spinner.getSelectedItem().toString().equals("Steam Press")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 3;
} else if (viewHolder.spinner.getSelectedItem().toString().equals("Wash + Steam Press")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 7;
}
databaseReference.child("price").setValue(p);
}
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
@Override
public int getItemCount() {
return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView english, quantity;
private Button add;
Spinner spinner;
private ImageView image;
ViewHolder(View itemView) {
super(itemView);
this.english = itemView.findViewById(R.id.english);
this.quantity = itemView.findViewById(R.id.quantity);
this.add = itemView.findViewById(R.id.add);
this.spinner = itemView.findViewById(R.id.typeof_service);
this.image = itemView.findViewById(R.id.img);
}
}
}
package com.example.laundryapp;
导入android.annotation.SuppressLint;
导入android.support.annotation.NonNull;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.ImageView;
导入android.widget.Spinner;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.bumptech.glide.glide;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入com.google.firebase.database.ValueEventListener;
导入java.util.ArrayList;
导入java.util.Objects;
类AllProductsAdapter扩展了RecyclerView.Adapter{
私有数组列表数据;
私有数据库引用,数据库引用;
私有布尔标志;
私人双p;
AllProductsAdapter(ArrayList数据){
setHasStableIds(true);
这个数据=数据;
}
@凌驾
公共长getItemId(int位置){
返回super.getItemId(位置);
}
@凌驾
public int getItemViewType(int位置){
返回super.getItemViewType(位置);
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
返回新的ViewHolder(LayoutInflater.from(viewGroup.getContext())。充气(R.layout.list_products,viewGroup,false));
}
@凌驾
public void onBindViewHolder(@NonNull final ViewHolder ViewHolder,@SuppressLint(“RecyclerView”)final int i){
viewHolder.english.setText(data.get(i.getEnglish());
viewHolder.quantity.setText(viewHolder.quantity.getText().toString());
GlideApp.with(viewHolder.image.getContext()).load(data.get(i.getUrl()).into(viewHolder.image));
ArrayAdapter=ArrayAdapter.createFromResource(viewHolder.spinner.getContext(),R.array.Services,android.R.layout.simple\u spinner\u项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
viewHolder.spinner.setAdapter(适配器);
如果(FirebaseAuth.getInstance().getCurrentUser()!=null){
reference=FirebaseDatabase.getInstance().getReference(“管理员”);
reference.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
if(Objects.equals(snapshot.child(“email”).getValue(String.class)、FirebaseAuth.getInstance().getCurrentUser().getEmail()){
flag=true;
viewHolder.add.setEnabled(false);
viewHolder.add.setVisibility(View.GONE);
viewHolder.quantity.setEnabled(假);
viewHolder.quantity.setVisibility(View.GONE);
viewHolder.spinner.setEnabled(false);
viewHolder.spinner.setVisibility(View.GONE);
打破
}
}
如果(!标志){
viewHolder.add.setEnabled(true);
viewHolder.add.setVisibility(View.VISIBLE);
reference=FirebaseDatabase.getInstance().getReference(“用户/”+FirebaseAuth.getInstance().getCurrentUser().getUid()+“/cart”);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
if(Objects.equals(snapshot.child(“english”).getValue()、data.get(i).getEnglish())和&Objects.equals(snapshot.child(“数量”).getValue(String.class)、viewHolder.quantity.getText().toString()){
viewHolder.add.setEnabled(false);
viewHolder.add.setText(R.string.added);
}
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
viewHolder.add.setOnClickListener(new View.OnClickListener()){
@凌驾
公共void onClick(视图v){
if(viewHolder.english.length()=0){
viewHolder.english.requestFocus();
viewHolder.english.setError(“这是必填字段”);
}else if(viewHolder.spinner.getSelectedItem()=“清洗”| | viewHolder.spinner.getSelectedItem()=“洗衣房”| | | viewHolder.spinner.getSelectedItem()=“蒸汽压榨”| viewHolder.spinner.getSelectedItem()=“清洗+蒸汽压榨”){
viewHolder.spinner.requestFocus();
Toast.makeText(viewHolder.spinner.getContext(),“选择服务”,Toast.LENGTH\u SHORT.show();
}否则{
package com.example.laundry1app;
import android.annotation.SuppressLint;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.Objects;
class AllProductsAdapter extends RecyclerView.Adapter<com.example.laundry1app.AllProductsAdapter.ViewHolder> {
private ArrayList<AllProductsData> data;
private DatabaseReference reference, databaseReference;
private boolean flag;
private Double p;
AllProductsAdapter(ArrayList<AllProductsData> data) {
setHasStableIds(true);
this.data = data;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_products, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, @SuppressLint("RecyclerView") final int i) {
viewHolder.english.setText(data.get(i).getEnglish());
viewHolder.quantity.setText(viewHolder.quantity.getText().toString());
GlideApp.with(viewHolder.image.getContext()).load(data.get(i).getUrl()).into(viewHolder.image);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(viewHolder.spinner.getContext(),R.array.Services, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
viewHolder.spinner.setAdapter(adapter);
if (FirebaseAuth.getInstance().getCurrentUser() != null) {
reference = FirebaseDatabase.getInstance().getReference("admins");
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (Objects.equals(snapshot.child("email").getValue(String.class), FirebaseAuth.getInstance().getCurrentUser().getEmail())) {
flag = true;
viewHolder.add.setEnabled(false);
viewHolder.add.setVisibility(View.GONE);
viewHolder.quantity.setEnabled(false);
viewHolder.quantity.setVisibility(View.GONE);
viewHolder.spinner.setEnabled(false);
viewHolder.spinner.setVisibility(View.GONE);
break;
}
}
if (!flag) {
viewHolder.add.setEnabled(true);
viewHolder.add.setVisibility(View.VISIBLE);
reference = FirebaseDatabase.getInstance().getReference("users/" + FirebaseAuth.getInstance().getCurrentUser().getUid() + "/cart");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (Objects.equals(snapshot.child("english").getValue(), data.get(i).getEnglish()) && Objects.equals(snapshot.child("quantity").getValue(String.class), viewHolder.quantity.getText().toString())) {
viewHolder.add.setEnabled(false);
viewHolder.add.setText(R.string.added);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
viewHolder.add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (viewHolder.english.length() == 0 ) {
viewHolder.english.requestFocus();
viewHolder.english.setError("This Is A Required Field");
} else if (viewHolder.spinner.getSelectedItem() == "Wash" || viewHolder.spinner.getSelectedItem() == "Laundry" || viewHolder.spinner.getSelectedItem() == "Steam Press" || viewHolder.spinner.getSelectedItem() == "Wash + Steam Press"){
viewHolder.spinner.requestFocus();
Toast.makeText(viewHolder.spinner.getContext(), "Select a service", Toast.LENGTH_SHORT).show();
}else {
databaseReference = reference.push();
databaseReference.child("english").setValue(data.get(i).getEnglish());
databaseReference.child("quantity").setValue(viewHolder.quantity.getText().toString());
databaseReference.child("image").setValue(data.get(i).getUrl());
databaseReference.child("service").setValue(viewHolder.spinner.getSelectedItem().toString());
if (viewHolder.spinner.getSelectedItem().toString().equals("Wash")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 5;
} else if (viewHolder.spinner.getSelectedItem().toString().equals("Laundry")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 8;
} else if (viewHolder.spinner.getSelectedItem().toString().equals("Steam Press")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 3;
} else if (viewHolder.spinner.getSelectedItem().toString().equals("Wash + Steam Press")) {
p = Double.parseDouble(viewHolder.quantity.getText().toString()) * 7;
}
databaseReference.child("price").setValue(p);
}
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
@Override
public int getItemCount() {
return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView english, quantity;
private Button add;
Spinner spinner;
private ImageView image;
ViewHolder(View itemView) {
super(itemView);
this.english = itemView.findViewById(R.id.english);
this.quantity = itemView.findViewById(R.id.quantity);
this.add = itemView.findViewById(R.id.add);
this.spinner = itemView.findViewById(R.id.typeof_service);
this.image = itemView.findViewById(R.id.img);
}
}
}
public class AllProductsData {
private int id;
private String english, url;
//...
@Override
public long getItemId(int position) {
return data[position].id;
}