删除项目时,RecyclerView显示不稳定。Android Studio和云Firestore

删除项目时,RecyclerView显示不稳定。Android Studio和云Firestore,android,android-recyclerview,google-cloud-firestore,Android,Android Recyclerview,Google Cloud Firestore,我有一个“删除项目”按钮放在“回收者”视图中的“卡片”视图中。当我按delete键时,该项似乎会短暂地重新创建其自身,然后消失。但是,当单击out然后返回到recyclerView活动时,该项在视图中重新创建了自己,但在数据库中没有。我想问题一定在deleteButton onClickListener中,但我似乎找不到解决问题的方法……任何建议都会很好。我已经包括了回收器适配器代码和显示cardView的活动代码。还有xml,以防它与可以在那里设置的onClick方法有关 UserMenuLi

我有一个“删除项目”按钮放在“回收者”视图中的“卡片”视图中。当我按delete键时,该项似乎会短暂地重新创建其自身,然后消失。但是,当单击out然后返回到recyclerView活动时,该项在视图中重新创建了自己,但在数据库中没有。我想问题一定在deleteButton onClickListener中,但我似乎找不到解决问题的方法……任何建议都会很好。我已经包括了回收器适配器代码和显示cardView的活动代码。还有xml,以防它与可以在那里设置的onClick方法有关

UserMenuListAdapter.java

import static com.melcolton.bite.UsersMenuActivity.finalId;

public class UserMenuListAdapter extends RecyclerView.Adapter<UserMenuListAdapter.ViewHolder> implements View.OnClickListener {

private static final String TAG = "Adapter Log";
private View.OnClickListener myClickListener;
private FirebaseFirestore fbFirestore;
private FirebaseAuth fbAuth;

public String fbUserId;
public List<UserMenu> userMenu;
public Context context;

public UserMenuListAdapter(Context context, List<UserMenu> userMenu, View.OnClickListener myClickListener) {
    this.myClickListener = myClickListener;
    this.userMenu =  userMenu ;
    this.context = context;
}

@NonNull
@Override
public UserMenuListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    Context context = parent.getContext();
    View menuView = LayoutInflater.from( context ).inflate( R.layout.item_confirm_list_element, parent, false );
    return new ViewHolder( menuView, myClickListener );
}

@Override
public void onBindViewHolder(@NonNull UserMenuListAdapter.ViewHolder holder, int position) {

    fbAuth = FirebaseAuth.getInstance();
    fbFirestore = FirebaseFirestore.getInstance();
    fbUserId = fbAuth.getCurrentUser().getUid();

    if (holder instanceof ViewHolder) {

        ViewHolder viewHolder = holder;

        holder.userMenuName.setText( userMenu.get( position ).getItemName() );
        holder.userMenuDesc.setText( userMenu.get( position ).getItemDesc() );
        holder.userMenuCals.setText( userMenu.get( position ).getItemCals().toString() );
        holder.userMenuCost.setText( userMenu.get( position ).getItemCost().toString() );

        holder.deleteButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText( context, "Removed", Toast.LENGTH_SHORT ).show();


                fbFirestore.collection( "AppUsers" ).document(fbUserId).collection( "UserMenu" ).document(finalId)
                        .delete().addOnSuccessListener( new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {

                        userMenu.remove( position );
                        notifyItemRemoved( position );
                        notifyItemRangeChanged( position, userMenu.size() );
                        notifyDataSetChanged();
                        //holder.menuView.setVisibility( View.GONE );

                    }
                } );

            }

        });
    }
}

@Override
public int getItemCount() {

    return userMenu.size();
}

public void onEvent (QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
    if (e !=null) {
        Log.w( TAG, "onEvent error: ",e );
        onError (e);
    }
}

private void onError(FirebaseFirestoreException e) {
    Log.w( TAG, "onEvent error: ",e );
}

@Override
public void onClick(View v) {

}

public class ViewHolder extends RecyclerView.ViewHolder {

    public CardView userMenuCardView;
    public TextView userMenuName;
    public TextView userMenuDesc;
    public TextView userMenuCals;
    public TextView userMenuCost;
    public Button deleteButton;
    View menuView;


    public ViewHolder(View itemView, View.OnClickListener myClickListener) {
        super( itemView );
        itemView.setOnClickListener( myClickListener );
        menuView = itemView;

        userMenuCardView = menuView.findViewById( R.id.user_menu_cardview );
        userMenuName = menuView.findViewById( R.id.txt_cart_item_name );
        userMenuDesc = menuView.findViewById( R.id.txt_cart_item_desc );
        userMenuCals = menuView.findViewById( R.id.txt_cart_item_cals );
        userMenuCost = menuView.findViewById( R.id.txt_cart_item_cost );
        deleteButton = menuView.findViewById( R.id.remove_button );
    }
}
}
import static com.melcolton.bite.ChooseRestaurant.valFromAct1;

public class UsersMenuActivity extends AppCompatActivity {

private static final String TAG = "UserMenuActivity";
public static String finalId;
public Context umContext;
public Button myButton;
public static int totalCalsSet;
public static double totalCostSet;
public TextView caloriesUsed;
public String toCalsUsed;

Toolbar menuToolbar;
private FirebaseFirestore umFirestore;
private FirebaseAuth umFirebaseAuth;
private FirebaseAuth mAuth;
private RecyclerView umRecyclerView;
private List<UserMenu> userMenu;
private View.OnClickListener umClickListener;
private UserMenuListAdapter userMenuListAdapter;
private String getUserId;
private TextView passedCalContent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_users_menu );

    menuToolbar = findViewById( R.id.menu_toolbar );
    setSupportActionBar( menuToolbar );

    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled( false );
        getSupportActionBar().setDisplayShowHomeEnabled( false );
    }

    myButton = findViewById( R.id.remove_button );

    caloriesUsed = findViewById( R.id.users_menu_calories_used );
    toCalsUsed = Integer.toString( totalCalsSet );
    caloriesUsed.setText( toCalsUsed );

    userMenu = new ArrayList<>();
    userMenuListAdapter = new UserMenuListAdapter( getApplicationContext(), userMenu, umClickListener );

    umRecyclerView = (RecyclerView) findViewById( R.id.user_menu_recycler_view );
    umRecyclerView.setHasFixedSize( true );
    umRecyclerView.setLayoutManager( new LinearLayoutManager( this ) );
    umRecyclerView.setAdapter( userMenuListAdapter );

    passedCalContent = findViewById( R.id.users_menu_calories_set );
    passedCalContent.setText( valFromAct1 );

    umFirestore = FirebaseFirestore.getInstance();
    umFirebaseAuth = FirebaseAuth.getInstance();

    getUserId = Objects.requireNonNull( umFirebaseAuth.getCurrentUser() ).getUid();


    CollectionReference userMenuRef = umFirestore.collection( "AppUsers" )
            .document( getUserId )
            .collection( "UserMenu" );
    userMenuRef.limit( 100 ).addSnapshotListener( (documentSnapshots, e) -> {

        if (e != null) {
            Log.d( TAG, "Error: " + e.getMessage() );

        }
        assert documentSnapshots != null;
        for (DocumentChange doc : Objects.requireNonNull( documentSnapshots ).getDocumentChanges()) {
            UserMenu menu = doc.getDocument().toObject( UserMenu.class ).withId( doc.getDocument().getId() );

            Log.d( TAG, doc.getDocument().getId() + " => " + doc.getDocument() );

            finalId = doc.getDocument().getId();
            userMenu.add( menu );
            userMenuListAdapter.notifyDataSetChanged();
        }
    } );


//Method here to calculate the total cals value to show in header.

    userMenuRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                int totalCals = 0;
                for (QueryDocumentSnapshot document : task.getResult()) {
                    double itemCals = document.getDouble("itemCals");
                    totalCals = (int) (totalCals + itemCals);
                }
                Log.d("TAG", String.valueOf(totalCals));

                totalCalsSet = totalCals;
            }
        }

    });

 //Calculates the total cost of the menu.

    userMenuRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                double totalCost = 0;
                for (QueryDocumentSnapshot document : task.getResult()) {
                    double itemCost = document.getDouble("itemCost");
                    totalCost = totalCost + itemCost;
                }
                Log.d("TAG", String.valueOf(totalCost));

                totalCostSet = totalCost;
            }
        }

    });



}


//ACTION BAR
@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate( R.menu.main_menu, menu );
    return true;
}

@Override
public boolean onOptionsItemSelected(android.view.MenuItem item) {

    switch (item.getItemId()) {
        case R.id.action_logout_button:
            logout();
            return true;

        case R.id.action_settings_button:
            Intent settingsIntent = new Intent( UsersMenuActivity.this,     AccSetupActivity.class );
            startActivity( settingsIntent );
            return true;

        case R.id.about_info:
            Intent aboutIntent = new Intent( UsersMenuActivity.this, DisclaimerActivity.class );
            startActivity( aboutIntent );
            return true;

        default:
            return false;
    }

}

private void sendToLogin() {

    Intent loginIntent = new Intent( UsersMenuActivity.this,     LogInActivity.class );
    startActivity( loginIntent );

}

private void logout() {
    mAuth.signOut();
    sendToLogin();
    finish();

}
}
import static com.melcolton.bite.UsersMenuActivity.finalId;
公共类UserMenuListAdapter扩展了RecyclerView。适配器实现了View.OnClickListener{
私有静态最终字符串TAG=“适配器日志”;
private View.OnClickListener myClickListener;
私人FirebaseFirestore fbFirestore;
私有FirebaseAuth fbAuth;
公共字符串用户ID;
公共列表用户菜单;
公共语境;
public UserMenuListAdapter(上下文上下文、列表用户菜单、View.OnClickListener myClickListener){
this.myClickListener=myClickListener;
this.userMenu=userMenu;
this.context=上下文;
}
@非空
@凌驾
public UserMenuListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int viewType){
Context=parent.getContext();
View menuView=LayoutInflater.from(context).充气(R.layout.item\u confirm\u list\u元素,父元素,false);
返回新的ViewHolder(menuView、myClickListener);
}
@凌驾
public void onBindViewHolder(@NonNull UserMenuListAdapter.ViewHolder,int位置){
fbAuth=FirebaseAuth.getInstance();
fbFirestore=FirebaseFirestore.getInstance();
fbUserId=fbAuth.getCurrentUser().getUid();
if(视图保持架的保持架实例){
ViewHolder-ViewHolder=holder;
holder.userMenuName.setText(userMenu.get(position.getItemName());
holder.userMenuDesc.setText(userMenu.get(position.getItemDesc());
holder.userMenuCals.setText(userMenu.get(position.getItemCals().toString());
holder.userMenuCost.setText(userMenu.get(position.getItemCost().toString());
holder.deleteButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(上下文“已删除”,Toast.LENGTH_SHORT).show();
fbFirestore.collection(“AppUsers”).document(fbUserId)。collection(“UserMenu”).document(finalId)
.delete().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
用户菜单。删除(位置);
已移除(位置)的项目;
notifyItemRangeChanged(位置,userMenu.size());
notifyDataSetChanged();
//holder.menuView.setVisibility(View.GONE);
}
} );
}
});
}
}
@凌驾
public int getItemCount(){
返回userMenu.size();
}
public void OneEvent(QuerySnapshot queryDocumentSnapshots,FirebaseFirestoreException e){
如果(e!=null){
Log.w(标记“onEvent错误:”,e);
onError(e);
}
}
私有void onError(FireBaseFireStore例外e){
Log.w(标记“onEvent错误:”,e);
}
@凌驾
公共void onClick(视图v){
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公共CardView用户MenuCardView;
公共文本视图用户菜单名;
公共文本视图用户菜单;
公共文本视图用户菜单;
公共文本视图用户菜单成本;
公共按钮删除按钮;
查看菜单视图;
公共视图持有者(视图项视图、视图.OnClickListener myClickListener){
超级(项目视图);
setOnClickListener(myClickListener);
menuView=itemView;
userMenuCardView=menuView.findViewById(R.id.user\u菜单\u cardview);
userMenuName=menuView.findviewbyd(R.id.txt\u cart\u item\u name);
userMenuDesc=menuView.findviewbyd(R.id.txt\u cart\u item\u desc);
userMenuCals=menuView.findviewbyd(R.id.txt\u cart\u item\u cals);
userMenuCost=menuView.findviewbyd(R.id.txt\u cart\u item\u cost);
deleteButton=menuView.findViewById(R.id.remove_按钮);
}
}
}
UsersMenuActivity.java

import static com.melcolton.bite.UsersMenuActivity.finalId;

public class UserMenuListAdapter extends RecyclerView.Adapter<UserMenuListAdapter.ViewHolder> implements View.OnClickListener {

private static final String TAG = "Adapter Log";
private View.OnClickListener myClickListener;
private FirebaseFirestore fbFirestore;
private FirebaseAuth fbAuth;

public String fbUserId;
public List<UserMenu> userMenu;
public Context context;

public UserMenuListAdapter(Context context, List<UserMenu> userMenu, View.OnClickListener myClickListener) {
    this.myClickListener = myClickListener;
    this.userMenu =  userMenu ;
    this.context = context;
}

@NonNull
@Override
public UserMenuListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    Context context = parent.getContext();
    View menuView = LayoutInflater.from( context ).inflate( R.layout.item_confirm_list_element, parent, false );
    return new ViewHolder( menuView, myClickListener );
}

@Override
public void onBindViewHolder(@NonNull UserMenuListAdapter.ViewHolder holder, int position) {

    fbAuth = FirebaseAuth.getInstance();
    fbFirestore = FirebaseFirestore.getInstance();
    fbUserId = fbAuth.getCurrentUser().getUid();

    if (holder instanceof ViewHolder) {

        ViewHolder viewHolder = holder;

        holder.userMenuName.setText( userMenu.get( position ).getItemName() );
        holder.userMenuDesc.setText( userMenu.get( position ).getItemDesc() );
        holder.userMenuCals.setText( userMenu.get( position ).getItemCals().toString() );
        holder.userMenuCost.setText( userMenu.get( position ).getItemCost().toString() );

        holder.deleteButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText( context, "Removed", Toast.LENGTH_SHORT ).show();


                fbFirestore.collection( "AppUsers" ).document(fbUserId).collection( "UserMenu" ).document(finalId)
                        .delete().addOnSuccessListener( new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {

                        userMenu.remove( position );
                        notifyItemRemoved( position );
                        notifyItemRangeChanged( position, userMenu.size() );
                        notifyDataSetChanged();
                        //holder.menuView.setVisibility( View.GONE );

                    }
                } );

            }

        });
    }
}

@Override
public int getItemCount() {

    return userMenu.size();
}

public void onEvent (QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
    if (e !=null) {
        Log.w( TAG, "onEvent error: ",e );
        onError (e);
    }
}

private void onError(FirebaseFirestoreException e) {
    Log.w( TAG, "onEvent error: ",e );
}

@Override
public void onClick(View v) {

}

public class ViewHolder extends RecyclerView.ViewHolder {

    public CardView userMenuCardView;
    public TextView userMenuName;
    public TextView userMenuDesc;
    public TextView userMenuCals;
    public TextView userMenuCost;
    public Button deleteButton;
    View menuView;


    public ViewHolder(View itemView, View.OnClickListener myClickListener) {
        super( itemView );
        itemView.setOnClickListener( myClickListener );
        menuView = itemView;

        userMenuCardView = menuView.findViewById( R.id.user_menu_cardview );
        userMenuName = menuView.findViewById( R.id.txt_cart_item_name );
        userMenuDesc = menuView.findViewById( R.id.txt_cart_item_desc );
        userMenuCals = menuView.findViewById( R.id.txt_cart_item_cals );
        userMenuCost = menuView.findViewById( R.id.txt_cart_item_cost );
        deleteButton = menuView.findViewById( R.id.remove_button );
    }
}
}
import static com.melcolton.bite.ChooseRestaurant.valFromAct1;

public class UsersMenuActivity extends AppCompatActivity {

private static final String TAG = "UserMenuActivity";
public static String finalId;
public Context umContext;
public Button myButton;
public static int totalCalsSet;
public static double totalCostSet;
public TextView caloriesUsed;
public String toCalsUsed;

Toolbar menuToolbar;
private FirebaseFirestore umFirestore;
private FirebaseAuth umFirebaseAuth;
private FirebaseAuth mAuth;
private RecyclerView umRecyclerView;
private List<UserMenu> userMenu;
private View.OnClickListener umClickListener;
private UserMenuListAdapter userMenuListAdapter;
private String getUserId;
private TextView passedCalContent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_users_menu );

    menuToolbar = findViewById( R.id.menu_toolbar );
    setSupportActionBar( menuToolbar );

    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled( false );
        getSupportActionBar().setDisplayShowHomeEnabled( false );
    }

    myButton = findViewById( R.id.remove_button );

    caloriesUsed = findViewById( R.id.users_menu_calories_used );
    toCalsUsed = Integer.toString( totalCalsSet );
    caloriesUsed.setText( toCalsUsed );

    userMenu = new ArrayList<>();
    userMenuListAdapter = new UserMenuListAdapter( getApplicationContext(), userMenu, umClickListener );

    umRecyclerView = (RecyclerView) findViewById( R.id.user_menu_recycler_view );
    umRecyclerView.setHasFixedSize( true );
    umRecyclerView.setLayoutManager( new LinearLayoutManager( this ) );
    umRecyclerView.setAdapter( userMenuListAdapter );

    passedCalContent = findViewById( R.id.users_menu_calories_set );
    passedCalContent.setText( valFromAct1 );

    umFirestore = FirebaseFirestore.getInstance();
    umFirebaseAuth = FirebaseAuth.getInstance();

    getUserId = Objects.requireNonNull( umFirebaseAuth.getCurrentUser() ).getUid();


    CollectionReference userMenuRef = umFirestore.collection( "AppUsers" )
            .document( getUserId )
            .collection( "UserMenu" );
    userMenuRef.limit( 100 ).addSnapshotListener( (documentSnapshots, e) -> {

        if (e != null) {
            Log.d( TAG, "Error: " + e.getMessage() );

        }
        assert documentSnapshots != null;
        for (DocumentChange doc : Objects.requireNonNull( documentSnapshots ).getDocumentChanges()) {
            UserMenu menu = doc.getDocument().toObject( UserMenu.class ).withId( doc.getDocument().getId() );

            Log.d( TAG, doc.getDocument().getId() + " => " + doc.getDocument() );

            finalId = doc.getDocument().getId();
            userMenu.add( menu );
            userMenuListAdapter.notifyDataSetChanged();
        }
    } );


//Method here to calculate the total cals value to show in header.

    userMenuRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                int totalCals = 0;
                for (QueryDocumentSnapshot document : task.getResult()) {
                    double itemCals = document.getDouble("itemCals");
                    totalCals = (int) (totalCals + itemCals);
                }
                Log.d("TAG", String.valueOf(totalCals));

                totalCalsSet = totalCals;
            }
        }

    });

 //Calculates the total cost of the menu.

    userMenuRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                double totalCost = 0;
                for (QueryDocumentSnapshot document : task.getResult()) {
                    double itemCost = document.getDouble("itemCost");
                    totalCost = totalCost + itemCost;
                }
                Log.d("TAG", String.valueOf(totalCost));

                totalCostSet = totalCost;
            }
        }

    });



}


//ACTION BAR
@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate( R.menu.main_menu, menu );
    return true;
}

@Override
public boolean onOptionsItemSelected(android.view.MenuItem item) {

    switch (item.getItemId()) {
        case R.id.action_logout_button:
            logout();
            return true;

        case R.id.action_settings_button:
            Intent settingsIntent = new Intent( UsersMenuActivity.this,     AccSetupActivity.class );
            startActivity( settingsIntent );
            return true;

        case R.id.about_info:
            Intent aboutIntent = new Intent( UsersMenuActivity.this, DisclaimerActivity.class );
            startActivity( aboutIntent );
            return true;

        default:
            return false;
    }

}

private void sendToLogin() {

    Intent loginIntent = new Intent( UsersMenuActivity.this,     LogInActivity.class );
    startActivity( loginIntent );

}

private void logout() {
    mAuth.signOut();
    sendToLogin();
    finish();

}
}
导入静态com.melcolton.bite.ChooseRestaurant.valFromAct1;
公共类UsersMenuActivity扩展了AppCompatActivity{
私有静态最终字符串标记=“UserMenuActivity”;
公共静态字符串finalId;
公共语境;
公共按钮myButton;
公共静态整数集合;
公共静态双重总成本集;
公共文本查看使用的卡路里;
要使用的公共字符串;
工具栏菜单工具栏;
私人FirebaseFirestore-umFirestore;
私有FirebaseAuth umFirebaseAuth;
私人消防队;
私人RecyclerView umRecyclerView;
私有列表用户菜单;
private View.OnClickListener umClickListener;
私有用户menulistadapter UserMenuListAdapter;
私有字符串getUserId;
私有TextView passedCalContent;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u users\u菜单);
menuToolbar=findviewbyd(R.id.menu\u工具栏);
设置支持操作栏(菜单工具栏);
如果(getSupportActionBar()!=null){
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowHomeEnabled(false);
}
myButton=findViewById(R.id.remove_按钮);
卡路里使用=findViewById(R.id.users\u menu\u carries\u used);
toCalsUsed=整数.toString(totalCalsSet);
使用的热量。setText(使用的热量);
userMenu=newarraylist
Context context = parent.getContext();
View menuView = LayoutInflater.from( context ).inflate( R.layout.item_confirm_list_element, parent, false );
return new ViewHolder( menuView, myClickListener );