【问题标题】:How to avoid the refresh effect of the FirebaseRecyclerAdapter如何避免 FirebaseRecyclerAdapter 的刷新效果
【发布时间】:2018-01-27 06:28:15
【问题描述】:

在以自动完成方式加载数据的文本字段中键入时刷新 FirebaseRecyclerAdapter 的效果。我曾经在onTextChanged方法的帮助下调用以下函数firebaseUserSearch来填充适配器。每次调用firebaseUserSearch 时,它都会刷新我不想要的recylerview,如果结果已经存在的话。

private void firebaseUserSearch(String searchText) {
    Query firebaseSearchQuery = mUserDatabase.orderByChild("name").startAt(searchText).endAt(searchText + "\uf8ff");
    FirebaseRecyclerAdapter<Users, SearchActivity.UsersViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Users, SearchActivity.UsersViewHolder>(
            Users.class,
            R.layout.list_layout,
            SearchActivity.UsersViewHolder.class,
            firebaseSearchQuery
    ) {
        @Override
        protected void populateViewHolder(SearchActivity.UsersViewHolder viewHolder, final Users model, final int position) {
            viewHolder.setDetails(getActivity().getApplicationContext(), model.getName(), model.getPlace(), model.getImage());
            viewHolder.relLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getActivity(), ResultActivity.class);
                    intent.putExtra("name", model.getName());
                    intent.putExtra("place", model.getPlace());
                    intent.putExtra("image", model.getImage());
                    startActivity(intent);

                }
            });
        }
    };
    mResultList.setAdapter(firebaseRecyclerAdapter);
}

【问题讨论】:

  • 请提供一些代码

标签: android firebase firebase-realtime-database android-recyclerview firebaseui


【解决方案1】:

onTextChanged 将在您每次在文本字段中输入内容时触发。

您可能想使用afterTextChanged

这是一个例子 -

editText.addTextChangedListener(
    new TextWatcher() {
        @Override public void onTextChanged(CharSequence s, int start, int before, int count) { }
        @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

        private Timer timer=new Timer();
        private final long DELAY = 500; // milliseconds

        @Override
        public void afterTextChanged(final Editable s) {
            timer.cancel();
            timer = new Timer();
            timer.schedule(
                new TimerTask() {
                    @Override
                    public void run() {
                        // TODO: do what you need here (refresh list)
                        // you will probably need to use runOnUiThread(Runnable action) for some specific actions
                    }
                }, 
                DELAY
            );
        }
    }
);

【讨论】:

    【解决方案2】:

    每次更改搜索词时,都会创建一个新查询和一个新适配器,这会导致数据完全重新加载(和重新绘制)。标准FirebaseRecyclerAdapter 无法阻止这种情况。

    如果您想要更智能的适配器,则必须自己创建。您必须将从查询中返回的每个项目与您已经拥有的项目进行比较,并且只将实际更改传递给您的适配器。

    虽然这绝对是可能的,但这是相当多的工作。如果您在此过程中遇到困难,请随时发布reproduces where you are stuck 的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多