繁体   English   中英

LiveData 观察者没有被触发

[英]LiveData observer not getting triggered

我正在尝试从 firebase 获取数据并显示它,但观察者不工作。 我使用的是 mvvm 架构,所以我有一个MainActivityViewModel ,其中数据(一个FirestoreMenu )是从 firestore 获取的,然后在MainActivity中提供和观察。 但是,观察者永远不会被触发。 我遵循了一些解释 LiveData 如何工作的教程,但我不知道我做错了什么。 有人可以帮我解决问题吗?

主要活动

public class MainActivity extends AppCompatActivity {

    private FirebaseAuth mAuth;
    private MainActivityViewModel mainActivityViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        RecyclerView recyclerView = findViewById(R.id.recycle_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);
        
        final MenuAdapter adapter = new MenuAdapter();

        recyclerView.setAdapter(adapter);

        mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

        mainActivityViewModel.getMenus().observe(this, new Observer<List<FirestoreMenu>>() {
            @Override
            public void onChanged(List<FirestoreMenu> firestoreMenus) {
                //update recycle view
                adapter.setFirestoreMenus(firestoreMenus);
            }
        });


        /* I also have tried this approach
        final MainActivityViewModel mMainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

        LiveData<List<FirestoreMenu>> mMenusList = mMainActivityViewModel.getMenus() ;
        final MenuListAdapter mAdapter = new MenuListAdapter(this, R.layout.adaptive_view_layout, mMainActivityViewModel.getMenus().getValue());

        mMenusList.observe(this, new Observer<List<FirestoreMenu>>() {
            @Override
            public void onChanged(List<FirestoreMenu> firestoreMenus) {

                mMainActivityViewModel.setMenusCollection("XmyTebpsvEyeBYBp2TUB");
                menusListView.setAdapter(mAdapter);
            }
        });
           */
    }

    @Override
    public void onStart() {
        super.onStart();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        signInAnonymously();
    }

    private void signInAnonymously() {
    ...
    }
}

MainActivityViewModel

public class MainActivityViewModel extends ViewModel {

    private MutableLiveData<List<FirestoreMenu>> mMenus;


    public MutableLiveData<List<FirestoreMenu>> getMenus(){
        if (mMenus == null){
            mMenus = new MutableLiveData<>();

        }
        return mMenus;
    }

    public void setMenusCollection(String location){
        FirebaseFirestore db = FirebaseFirestore.getInstance();

        CollectionReference menusRef = FirebaseFirestore.getInstance().collection("locations/"+location+"/menus");
        menusRef.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                ArrayList<FirestoreMenu> dataSet = new ArrayList<>();
                for (DocumentSnapshot document : queryDocumentSnapshots.getDocuments()) {
                    FirestoreMenu menu = document.toObject(FirestoreMenu.class);
                    dataSet.add(menu);
                }
                mMenus.setValue(dataSet);
            }
        });
    }
}

菜单适配器

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuHolder> {

    private List<FirestoreMenu> firestoreMenus= new ArrayList<>();


    @NonNull
    @Override
    public MenuHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.menu_item,parent,false);
        return new MenuHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MenuHolder holder, int position) {
        FirestoreMenu currentMenu = firestoreMenus.get(position);
        holder.textViewTitle.setText(currentMenu.getName());
        holder.textViewDescritpion.setText(currentMenu.getId());
        holder.textViewDescritpion.setText(currentMenu.getImage());
    }

    @Override
    public int getItemCount() {
        return firestoreMenus.size();
    }
    public void setFirestoreMenus (List<FirestoreMenu> menus){
        this.firestoreMenus = menus;
        notifyDataSetChanged();
    }

    class MenuHolder extends RecyclerView.ViewHolder{
        private TextView textViewTitle;
        private TextView textViewDescritpion;
        private TextView textViewPriority;

        public MenuHolder(View itemView){
            super(itemView);
            textViewTitle = itemView.findViewById(R.id.text_view_title);
            textViewDescritpion = itemView.findViewById(R.id.text_view_description);
            textViewPriority = itemView.findViewById(R.id.text_view_priority);
        }
    }
}

问题不在于观察者,我认为你的 firebase 参考有问题,这就是为什么它没有进入你的 onSuccess .collection("locations/"+location+"/menus") --> check this reference you should use .document导航到某个文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM