Как очистить элементы просмотра ресайклера? - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над приложением, в котором я использовал режим ресайклера для отображения данных из firebase. Когда пользователь выходит из системы, элементы в представлении ресайклера не уничтожаются. При входе в систему другого пользователя он / она может видеть предыдущие данные пользователя.

Как очистить представление ресайклера, когда пользователь нажимает кнопку выхода. Я пытался очистить все данные из приложения, но оно закрывает приложение, и пользователю необходимо повторно щелкнуть приложение.

мой класс адаптера.

public class UserHistoryViewAdapter extends RecyclerView.Adapter<UserHistoryViewAdapter.UserHistoryViewHolder>{
private List<UserHistoryModel> userHistoryModels;
private Dialog UserHistoryPopUp;
private TextView bookingid_pop_up,check_in_date_time_pop_up,room_no, floor_no ,room_type;
private Button close_btn;


public void setUserHistoryModels(List<UserHistoryModel> userHistoryModels) {
    this.userHistoryModels = userHistoryModels;
}

@NonNull
@Override
public UserHistoryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_history,parent,false);
    UserHistoryPopUp = new Dialog(view.getContext());
    UserHistoryPopUp.setContentView(R.layout.user_history_pop_up);
    bookingid_pop_up = UserHistoryPopUp.findViewById(R.id.BookingId);
    check_in_date_time_pop_up = UserHistoryPopUp.findViewById(R.id.check_in_date_time_pop_up);
    room_no = UserHistoryPopUp.findViewById(R.id.Room_no_pop_up);
    floor_no = UserHistoryPopUp.findViewById(R.id.Floor_no_pop_up);
    room_type = UserHistoryPopUp.findViewById(R.id.Room_Type_pop_up);
    close_btn = UserHistoryPopUp.findViewById(R.id.Close_btn);

    return new UserHistoryViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull UserHistoryViewHolder holder, final int position) {
    final String bookingid = userHistoryModels.get(position).getBookingId();
    final Timestamp check_in_d_t = userHistoryModels.get(position).getCheck_in_date_time();
    final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
    holder.bookingid.setText(bookingid);
    holder.showdetails.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            bookingid_pop_up.setText(bookingid);
            check_in_date_time_pop_up.setText(sdf.format(check_in_d_t.toDate()));
            room_no.setText(String.valueOf(userHistoryModels.get(position).getRoomNo()));
            floor_no.setText(String.valueOf(userHistoryModels.get(position).getFloorNo()));
            room_type.setText(userHistoryModels.get(position).getRoomType());
            UserHistoryPopUp.show();
            close_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    UserHistoryPopUp.dismiss();
                }
            });

        }
    });
}

@Override
public int getItemCount() {

    if(userHistoryModels==null){
        return 0;
    }
    else {

    return userHistoryModels.size();}
}

public class UserHistoryViewHolder extends RecyclerView.ViewHolder {
    private TextView bookingid;
    private Button showdetails;


    public UserHistoryViewHolder(@NonNull View itemView) {
        super(itemView);
        bookingid = itemView.findViewById(R.id.Booking_id_textview);
        showdetails = itemView.findViewById(R.id.Show_booking_details);

    }



}

}

Вот мой класс модели просмотра:

public class UserHistoryViewModel extends ViewModel implements FirebaseRespositary.OnFirestoreTaskCompleted {
private MutableLiveData<List<UserHistoryModel>> UserHistoryData = new MutableLiveData<List<UserHistoryModel>>();
private MutableLiveData<Integer> size1 = new MutableLiveData<>();




public UserHistoryViewModel(){

}

public LiveData<Integer> getSize1(String emailId) {
    firebaseRespositary.getSize(emailId);
    return size1;
}

public LiveData<List<UserHistoryModel>> getUserHistoryData(String emaild) {
    firebaseRespositary.getData(emaild);
    return UserHistoryData;
}


private FirebaseRespositary firebaseRespositary = new FirebaseRespositary(this);

@Override
public void UserCheckedInDetails(List<UserHistoryModel> userHistoryViewModels) {
        UserHistoryData.setValue(userHistoryViewModels);
}

@Override
public void FirestoreError(Exception e) {

}

@Override
public void UserHistorySize(int size) {
    size1.setValue(size);
}

} Вот мой наблюдатель:

final String currentuser = firebaseAuth.getCurrentUser().getEmail();
   final UserHistoryViewModel userHistoryViewModel = new ViewModelProvider(getActivity()).get(UserHistoryViewModel.class);
    userHistoryViewModel.getSize1(currentuser).observe(getViewLifecycleOwner(), new Observer<Integer>() {
        @Override
        public void onChanged(final Integer integer) {
            if(integer!=0){
                no_data_progressbar.setVisibility(View.VISIBLE);
                userHistoryViewModel.getUserHistoryData(currentuser).observe(getViewLifecycleOwner(), new Observer<List<UserHistoryModel>>() {
                    @Override
                    public void onChanged(List<UserHistoryModel> userHistoryModels) {
                        no_data_progressbar.setVisibility(View.VISIBLE);
                        if(integer!=0) {
                            if (userHistoryModels.size() != 0) {
                                no_data_progressbar.setVisibility(View.INVISIBLE);
                                no_data.setVisibility(View.INVISIBLE);
                                check_data.setVisibility(View.INVISIBLE);
                                userHistoryModelList.addAll(userHistoryModels);
                                userHistoryViewAdapter.setUserHistoryModels(userHistoryModelList);
                                
                            }
                        }

                    }
                });
            }else{
                userHistoryModelList.clear();
                userHistoryViewAdapter.notifyDataSetChanged();
                no_data_progressbar.setVisibility(View.INVISIBLE);
                no_data.setVisibility(View.VISIBLE);
                check_data.setVisibility(View.VISIBLE);

            }
        }
    });

функция выхода:

    private void Logout() {
        if(network.isConnectingToInternet()){
//            if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
//                ((ActivityManager) getContext().getSystemService(ACTIVITY_SERVICE))
//                        .clearApplicationUserData();
//                return;
//            }
            no_data_progressbar.setVisibility(View.VISIBLE);
            userHistoryModelList.clear();
            userHistoryViewAdapter.notifyDataSetChanged();
            no_data_progressbar.setVisibility(View.INVISIBLE);

        Toast.makeText(getContext(),"Sign out",Toast.LENGTH_SHORT).show();
        firebaseAuth.signOut();

        navController.navigate(R.id.action_mainpage_to_loginscreen);
                }
        else {
            new AlertDialog.Builder(getActivity())
                    .setTitle("No Internet")
                    .setMessage("Please connect to Internet first.")
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            getActivity().finish();
                        }
                    })
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();
        }

    }

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Если вы используете ListAdapter, вы можете сделать следующее, если хотите очистить данные RecyclerView:

myListAdapter.submitList(emptyList())

Java:

myListAdapter.submitList(new ArrayList<YourType>());

Если вы используя реализацию RecyclerView.Adapter, вы захотите сбросить внутренние данные вашего адаптера, чтобы они были пустыми, а затем уведомите адаптер об изменении данных.

В вашем классе адаптера:

private val _myLocalListOfData = mutableListOf<YourType>()

fun clearData() {
  _myLocalListOfData.clear()
  notifyDataSetChanged()
}

Java Версия:

private List<YourType> _myLocalListOfData = new ArrayList<YourType>();

public void clearData() {
  _myLocalListOfData.clear();
  notifyDataSetChanged();
}
0 голосов
/ 13 июля 2020

Я полагаю, у вас есть Arraylist или Mutablelist в вашей деятельности, когда пользователь нажимает кнопку выхода из системы, вызывая clear () в списке, и уведомляет адаптер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...