如何避免 FirebaseRecyclerAdapter 的刷新效果


刷新效果

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

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

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

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

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

虽然这绝对是可能的,但这是相当多的工作。如果您在此过程中遇到困难,请随时发布一个问题,重现您遇到困难的地方。

相关内容

  • 没有找到相关文章

最新更新