【问题标题】:Using a spinner to populate RecyclerView使用微调器填充 RecyclerView
【发布时间】:2018-03-14 05:13:04
【问题描述】:

我正在从 Firebase 的 Firestore 数据库加载列表以填充微调器。这样可行。我想在微调器中的 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 中放置或调用此代码,则它可以正常工作。但我想稍后修改代码,以便稍后在微调器中基于 String 填充。 (可能只是添加另一个 .whereEqualto)

当我从这里调用 populateRecycler() 时,它不起作用(我正在使用 ButterKnife,仅供参考):

@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 DB 调用)调用 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());
                    }
                }

【问题讨论】:

  • “它不起作用”是什么意思?
  • 对不起,我没有澄清。屏幕上什么也没有出现。但没有任何错误。
  • 您是否尝试在更改回收站视图的数据后添加adapter.notifyDataSetChanged()
  • 是的,我刚刚在populateRecycler 上做了,添加了mAdapter.notifyDataSetChanged();,但还是一样。
  • 这行代码返回了什么? Toast.makeText(getBaseContext(), "Selected item " + spinnerValue, Toast.LENGTH_SHORT).show();

标签: android firebase google-cloud-firestore android-recyclerview


【解决方案1】:

如果您在使用下面代码的微调器值选择时间上调用 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) {

        }
    });

【讨论】:

  • 是的,这与没有 ButterKnife 的代码相同。我也试过了,同样的问题。
  • 检查你的微调器是否包含字符串数组,因为我测试上面的代码是有效的。
  • 是的,我的微调器包含字符串没问题。但是当从 setOnItemSelectedListener 调用 populateRecycler - 我的 recyclerview 是空的。但是当从 onCreate 调用 populateRecycler 时,它会被填充。
【解决方案2】:

首先用这个方法检查,你的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。请参阅我的示例,它工作正常。 首先在Activity 中声明微调器,如下所示:

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

试试这个,看看你的代码出了什么问题。

【讨论】:

  • 是的,我的代码几乎完全相同。我在public void spinnerItemSelected 中的 Toast..makeText 有效。只有populateRecycler 没有。
  • 表示在此方法中显示吐司 spinnerItemSelected 但 populateRecycler 不起作用。我说的对吗?
  • 是的,正确的。但如果我从 onCreate 调用 populateRecycler,它就可以工作。
  • 我检查了相同的场景,它的工作正常我认为问题出在你的这段代码中:final String UserID = getIntent().getExtras().getString(UserIDKey); mQuery = mFirestore .collection(RootCollection) .whereEqualTo("UID", UserID) .orderBy("DateAdded", Query.Direction.DESCENDING);
  • 请检查您是否获得了最终的 String UserID = getIntent().getExtras().getString(UserIDKey);这些数据是否正确,我认为在 onCreate 中你得到了正确但在外面没有
【解决方案3】:

我已经解决了。我想毕竟这确实是一个 Firestore 解决方案。

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

   mAdapter.setQuery(query);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2012-06-20
    • 2018-05-20
    相关资源
    最近更新 更多