首页 > 解决方案 > SearchData 方法重置查询?Firebase 数据库 Android

问题描述

总的来说,事情是,我有三个片段。在第二个片段中,它获取提供的数据,这是代码。

1)MyPostFragment.class

public class MyPostsFragment extends PostListFragment {
public MyPostsFragment() {}

@Override
public Query getQuery(DatabaseReference databaseReference) {
    return databaseReference.child("songsDB")
            .orderByChild("stars/" + getUid())
            .equalTo(true);
}

2)PostListFragment

public abstract class PostListFragment extends Fragment {
private DatabaseReference mDatabase;
private FirebaseRecyclerAdapter mAdapter;
private RecyclerView mRecycler;
private Activity mActivity;
Query mRef;
SearchView searchView;
LinearLayoutManager mManager;
FirebaseDatabase mFirebaseDatabase;

public PostListFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    View rootView = inflater.inflate(R.layout.fragment_all_posts, container, false);
    mRecycler = rootView.findViewById(R.id.messages_list);

    mRecycler.setHasFixedSize(true);
    mDatabase = FirebaseDatabase.getInstance().getReference();


    return rootView;

}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);

    // Set up Layout Manager, reverse layout
    mManager = new LinearLayoutManager(getActivity());
    mManager.setReverseLayout(true);
    mManager.setStackFromEnd(true);
    mRecycler.setLayoutManager(mManager);

    Query postsQuery = getQuery(mDatabase);
    ShowData(postsQuery);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_main, menu);
    MenuItem item = menu.findItem(R.id.action_search);
    searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            SearchData(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            //Filter as you type
            SearchData(newText);
            return false;
        }
    });
    super.onCreateOptionsMenu(menu,inflater);
}


private FirebaseRecyclerAdapter getMAdapter(Query query){
    mActivity = getActivity();
    final Dialog mDialog = new Dialog(mActivity, R.style.NewDialog);
    mDialog.addContentView(
            new ProgressBar(mActivity),
            new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
    );
    mDialog.setCancelable(true);
    mDialog.show();

    FirebaseRecyclerOptions<Post> options = new FirebaseRecyclerOptions.Builder<Post>()
            .setQuery(query, Post.class)
            .build();

    mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {
        @Override
        protected void onBindViewHolder(PostViewHolder viewHolder, int position, final Post model) {
            final DatabaseReference postRef = getRef(position);

            // Determine if the current user has liked this post and set UI accordingly
            if (model.stars.containsKey(getUid())) {
                viewHolder.starView.setImageResource(R.drawable.ic_toggle_star_24);
            } else {
                viewHolder.starView.setImageResource(R.drawable.ic_toggle_star_outline_24);
            }

            if (!TextUtils.isEmpty(model.kzSongytblink))
                viewHolder.mImage.setImageResource(R.drawable.on_line_logo);
            else viewHolder.mImage.setImageResource(R.drawable.off_line_logo);

            // Bind Post to ViewHolder, setting OnClickListener for the star button
            viewHolder.bindToPost(model, new View.OnClickListener() {
                @Override
                public void onClick(View starView) {
                    // Need to write to both places the post is stored
                    DatabaseReference globalPostRef = mDatabase.child("songsDB").child(postRef.getKey());
                    // Run two transactions
                    onStarClicked(globalPostRef);
                }
            });

            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(mActivity, PostDetailActivity.class);
                    intent.putExtra(PostDetailActivity.EXTRA_POST_KEY, postRef.getKey());
                    startActivity(intent);
                }
            });
        }

        @Override
        public PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
            return new PostViewHolder(inflater.inflate(R.layout.item_post, viewGroup, false));
        }
    };
    return mAdapter;
}


public void ShowData(Query postsQuery) {

    mAdapter=getMAdapter(postsQuery);
    mRecycler.setAdapter(mAdapter);

}

public void SearchData(String searchText){
    //SearchData
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    mRef = FirebaseDatabase.getInstance().getReference("songsDB");

    Query postsQuery= mRef.orderByChild("kzSongTitle").startAt(searchText).endAt(searchText + "\uf8ff");

    mAdapter=getMAdapter(postsQuery);
    mRecycler.setAdapter(mAdapter);
}
@Override
public void onStart() {
    super.onStart();
    if (mAdapter != null) {
        mAdapter.startListening();
    }
}

@Override
public void onStop() {
    super.onStop();
    if (mAdapter != null) {
        mAdapter.stopListening();
    }
}

private void onStarClicked(DatabaseReference postRef) {
    postRef.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Post p = mutableData.getValue(Post.class);
            if (p == null) {
                return Transaction.success(mutableData);
            }

            if (p.stars.containsKey(getUid())) {
                // Unstar the post and remove self from stars
                p.starCount = p.starCount - 1;
                p.stars.remove(getUid());
            } else {
                // Star the post and add self to stars
                p.starCount = p.starCount + 1;
                p.stars.put(getUid(), true);
            }

            // Set value and report transaction success
            mutableData.setValue(p);
            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
            Log.d("postTransaction", "onComplete:" + dataSnapshot.getKey());
        }
    });
}

public String getUid() {
    return FirebaseAuth.getInstance().getCurrentUser().getUid();
}

public abstract Query getQuery(DatabaseReference databaseReference);

}

如果删除 SearchData 方法,一切都会正常加载,但搜索不起作用,我需要它。

没有方法 SearchData :

没有方法 SearchData

如果您不删除 SearchData,则从所有片段中的数据库加载所有数据。我需要修复它,但我不知道如何修复它。请帮帮我。

使用方法 SearchData :

使用方法 SearchData

标签: javaandroidfirebasefirebase-realtime-database

解决方案


推荐阅读