简体   繁体   English

使用微调器填充RecyclerView

[英]Using a spinner to populate RecyclerView

I am loading a list from Firebase's Firestore DB to populate a spinner. 我正在从Firebase的Firestore DB加载列表以填充微调器。 That works. 这样可行。 I want to populate a RecyclerView upon ItemSelected in the spinner. 我想在微调器中的ItemSelected上填充一个RecyclerView。

I have this code to populate RecyclerView: 我有以下代码来填充RecyclerView:

private void populateRecycler(final String RootCollection, final String UserID) {
    final String UserID = getIntent().getExtras().getString(UserIDKey);
    mQuery = mFirestore
            .collection(RootCollection)
            .whereEqualTo("UID", UserID)
            .orderBy("DateAdded", Query.Direction.DESCENDING);

    mAdapter = new OrdersAdapter(mQuery, HomeActivity.this);

    mOrdersRecycler.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    mOrdersRecycler.setAdapter(mAdapter);
}

This code works fine if it's placed or called from onCreate. 如果将其放置在onCreate上或从onCreate调用,则此代码可以正常工作。 But I want to modify the code later to populate base on String in the spinner later. 但是我想稍后修改代码,以便稍后在微调器中基于String进行填充。 (probably just to add another .whereEqualto) (可能只是添加另一个.whereEqualto)

When I call populateRecycler() from here, it doesn't work (I'm using ButterKnife, fyi): 当我从此处调用populateRecycler()时,它不起作用(我正在使用ButterKnife,fyi):

@OnItemSelected(R.id.storespinner)
public void spinnerItemSelected(Spinner spinner, int position) {
    String spinnerValue = mStoreSpinner.getItemAtPosition(position).toString();
    Toast.makeText(getBaseContext(), "Selected item " + spinnerValue, Toast.LENGTH_SHORT).show();
populateRecycler("test", UserID);
}

Or if I call populateRecycler from another onSuccess listener (Firebase Firestore DB call), it also does not work: 或者,如果我从另一个onSuccess侦听器(Firebase Firestore DB调用)调用populateRecycler,它也将不起作用:

    public void onSuccess(DocumentSnapshot documentSnapshot) {
                    UIDOrg uidOrg = documentSnapshot.toObject(UIDOrg.class);
                    mOrgTextView.setText(uidOrg.getOrg()); 
                    RootCollection = uidOrg.getRootCollection();
                    populateRecycler("test", UserID);

Can someone please point me in the right direction ? 有人能指出我正确的方向吗?

Why does populateRecycler only work when called from onCreate? 为什么populateRecycler仅在从onCreate调用时才起作用?

Edit: This is how I fill the spinner array. 编辑:这就是我填充微调器数组的方式。

                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    UIDOrg uidOrg = documentSnapshot.toObject(UIDOrg.class);
                    mOrgTextView.setText(uidOrg.getOrg());
                    RootCollection = uidOrg.getRootCollection();

                    //Populate Spinner here
                    readData(new FirestoreCallBack() {
                        @Override
                        public void onCallback(List<String> list) {
                            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, list);
                            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                            mStoreSpinner.setAdapter(adapter);
                        }
                    });
                    //End of Spinner
                }

And in readData() it's: 在readData()中是:

                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (DocumentSnapshot document : task.getResult()) {
                           spinnerArray.add(String.valueOf(document.getId()));
                        }
                        firestoreCallBack.onCallback(spinnerArray);
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }

firstly check with this method, your onItemSelected working properly on not: 首先使用此方法进行检查,您的onItemSelected不能正常工作:

   spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
         @Override
         public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
             Toast.makeText(MainActivity.this, "test"+ position, Toast.LENGTH_SHORT).show();

         }

         @Override
         public void onNothingSelected(AdapterView<?> parent) {

         }
     });

if it is working fine then issue may be in your declaration with ButterKnife . 如果运行正常,则问题可能在您的ButterKnife声明中。 See my example its working properly. 看看我的例子,它正常工作。 firstly declare spinner in Activity like this: 首先在Activity声明Spinner,如下所示:

  @InjectView(R.id.spinner)
    Spinner spinner;

then in oncreate method: 然后在oncreate方法中:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);

        ArrayList<String> list = new ArrayList<>();
        list.add("test");
        list.add("test1");
        list.add("test2");
        list.add("test3");
        list.add("test4");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,list);
        spinner.setAdapter(adapter);

    }

then outside this method i declare OnItemSelected in activity 然后在此方法之外,我在activity声明OnItemSelected

   @OnItemSelected(R.id.spinner)
    public void spinnerItemSelected(Spinner spinner, int position) {
        Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
    }

try this and check what going wrong with your code. 试试这个,并检查您的代码出了什么问题。

if you call populateRecycler method on spinner value selection time that used below code i not provide the code in butter kinfe library but provide simple java code and you will convert into butter kinfe code ... 如果您在以下代码使用的微调器值选择时间上调用populateRecycler方法,则我不会在butter kinfe库中提供代码,而是提供简单的Java代码,您将转换为butter kinfe代码...

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            String spinnerValue = spinner.getSelectedItem().toString();
            Toast.makeText(getBaseContext(), "Selected item " + spinnerValue, Toast.LENGTH_SHORT).show();
            populateRecycler("test", UserID);        
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

I've solved it. 我已经解决了 I guess after-all it's really a Firestore solution. 我想毕竟这确实是一个Firestore解决方案。

I really just needed this line when populateRecycler is called from elsewhere other than onCreate. 当从onCreate以外的其他地方调用populateRecycler时,我真的只需要此行。

   mAdapter.setQuery(query);

Firestore is already updating the Recycler dynamically, all I needed to do was to update a new query and then .setQuery(query) so that the Recycler view is updated. Firestore已经在动态地更新Recycler,我要做的就是先更新一个新查询,然后再更新.setQuery(query),以便更新Recycler视图。

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

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