首页 文章

使用微调器填充RecyclerView

提问于
浏览
0

我正在从Firebase的Firestore DB加载一个列表来填充一个微调器 . 这样可行 . 我想在微调器中的ItemSelected上填充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);
}

如果从onCreate放置或调用此代码,则此代码可以正常工作 . 但是我想稍后修改代码,以便稍后在spinner中填充String . (可能只是为了添加另一个.whereEqualto)

当我从这里打电话给 populateRecycler() 时,它不会使用ButterKnife,fyi):'t work (I'

@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);
}

或者,如果我从另一个onSuccess侦听器(Firebase Firestore数据库调用)调用populateRecycler,它也不起作用:

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

有人可以指点我正确的方向吗?

为什么 populateRecycler 仅在从onCreate调用时才起作用?

编辑:这是我填充微调器数组的方式 .

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
                }

在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());
                    }
                }

3 回答

  • 0

    如果你在下面代码中使用的微调器值选择时调用populateRecycler方法,我不提供黄油kinfe库中的代码,但提供简单的java代码,你将转换为黄油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) {
    
            }
        });
    
  • 0

    首先检查一下这个方法,你的 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) {
    
             }
         });
    

    如果它工作正常,那么问题可能在你的 ButterKnife 声明中 . 看看我的例子它是否正常工作 . 首先在_1753756中声明微调器,如下所示:

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

    然后在 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);
    
        }
    

    然后在这个方法之外我在 activity 中宣布 OnItemSelected

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

    试试这个并检查代码出了什么问题 .

  • 0

    我已经解决了 . 我想它毕竟是一个Firestore解决方案 .

    当从onCreate以外的其他地方调用populateRecycler时,我真的只需要这一行 .

    mAdapter.setQuery(query);
    

    Firestore已经动态更新了Recycler,我需要做的就是更新一个新查询,然后更新.setQuery(查询),以便更新Recycler视图 .

相关问题