Android的Firebase查询搜索标题问题 [英] Android firebase query search title issue

查看:228
本文介绍了Android的Firebase查询搜索标题问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是SearchActivity.java

  public class SearchActivity extends AppCompatActivity 
{
/ * UI * /
private EditText mSearchText;
私人按钮mSearchBtn;
私人工具栏mSearchToolbar;

private FragmentPagerAdapter mPagerAdapter;
私人ViewPager mViewPager;

私有字符串值;

私人TextWatcher tw;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);

mSearchText =(EditText)findViewById(R.id.activity_search_search_text);
mSearchBtn =(Button)findViewById(R.id.activity_search_search_btn);

mSearchToolbar =(工具栏)findViewById(R.id.activity_search_toolbar);
setSupportActionBar(mSearchToolbar);
getSupportActionBar()。setDisplayHomeAsUpEnabled(true);
getSupportActionBar()。setTitle(null);

mSearchBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
value ();
toText.getText()。toString();
Toast.makeText(SearchActivity.this,value test 1:+ value,Toast.LENGTH_LONG).show();
searchText(value);
}
});

$ b private void searchText(final String value)
{
Toast.makeText(SearchActivity.this,value test 2:+ value,Toast.LENGTH_LONG )。显示();
mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
{
private final Fragment [] mFragments = new Fragment []
{
new FragmentSearch(value)
};

@Override
public Fragment getItem(int position)
{
return mFragments [position];
}

@Override
public int getCount()
{
return mFragments.length;
}
};
mViewPager =(ViewPager)findViewById(R.id.activity_search_view_pager);
mViewPager.setAdapter(mPagerAdapter);




$ b $ p $这是FragmentSearch.java

  public class FragmentSearch extends MainFragment 
{
public String value;

public FragmentSearch(String value)
{
this.value = value;
}

@Override
public Query getQuery(DatabaseReference databaseReference)
{
Toast.makeText(getActivity()。this,value test 3: + value,Toast.LENGTH_LONG).show();
查询postsQuery = databaseReference.child(Post)。orderByChild(title)。equalTo(value);

return postsQuery;




$ b $这是MainFragment.java $ b $公共抽象类MainFragment扩展片段
{
私有DatabaseReference mDatabase;
$ b $ pre $

私有FirebaseRecyclerAdapter< Post,PostViewHolder> mAdapter;
私人RecyclerView mRecycler;
私有LinearLayoutManager mManager;
$ b $ public MainFragment()
{

}

@Override
public查看onCreateView(LayoutInflater inflater,ViewGroup容器, Bundle savedInstanceState)
{
super.onCreateView(inflater,container,savedInstanceState);
查看rootView = inflater.inflate(R.layout.fragment_all_posts,container,false);

mDatabase = FirebaseDatabase.getInstance()。getReference();

mRecycler =(RecyclerView)rootView.findViewById(R.id.messages_list);
mRecycler.setHasFixedSize(true);

return rootView;
}

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

mManager = new LinearLayoutManager(getActivity());
mManager.setReverseLayout(true);
mManager.setStackFromEnd(true);
mRecycler.setLayoutManager(mManager);

查询postsQueryQuery = getQuery(mDatabase);

mAdapter = new FirebaseRecyclerAdapter< Post,PostViewHolder>(Post.class,R.layout.item_post,
PostViewHolder.class,postsQuery)
{
@Override
protected void populateViewHolder(final PostViewHolder viewHolder,final Post model,final int position)
{
final DatabaseReference postRef = getRef(position);

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

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

$ b $ viewHolder.bindToPost(model,new View.OnClickListener()
{
@Override
public void onClick(View starView)

DatabaseReference globalPostRef = mDatabase.child(Post)。child(postRef.getKey());
DatabaseReference userPostRef = mDatabase.child(UserPost)。child(model.uid)。 child(postRef.getKey());

onStarClicked(globalPostRef);
onStarClicked(userPostRef);
}
});
}
};
mRecycler.setAdapter(mAdapter);

$ b $ private void onTransaction(new Transaction.Handler() doTransaction(MutableData mutableData){
Post p = mutableData.getValue(Post.class);
if(p == null){
return Transaction.success(mutableData);
}
$ b $ if(p.stars.containsKey(getUid())){
//取消星标,从星星中删除自己
p.starCount = p.starCount - 1 ;
p.stars.remove(getUid());
} else {
//将帖子加上星号
p.starCount = p.starCount + 1 ;
p.stars.put(getUid(),true);
}

//设置值并报告事务成功
mutableData.setValue(P);
返回Transaction.success(mutableData);

$ b @Override
public void onComplete(DatabaseError databaseError,boolean b,
DataSnapshot dataSnapshot){
}
});

$ b $ @Override
public void onDestroy()
{
super.onDestroy();
if(mAdapter!= null)
{
mAdapter.cleanup();


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

public abstract Query getQuery(DatabaseReference databaseReference);




$ p $这是PostViewHolder.java

  public class PostViewHolder extends RecyclerView.ViewHolder 
{
public TextView titleView;
public TextView authorView;
public ImageView starView;
public TextView numStarsView;
public TextView bodyView;

public PostViewHolder(View itemView)
{
super(itemView);

titleView =(TextView)itemView.findViewById(R.id.post_title);
authorView =(TextView)itemView.findViewById(R.id.post_author);
starView =(ImageView)itemView.findViewById(R.id.star);
numStarsView =(TextView)itemView.findViewById(R.id.post_num_stars);
bodyView =(TextView)itemView.findViewById(R.id.post_body);
}

public void bindToPost(Post post,View.OnClickListener starClickListener)
{
titleView.setText(post.title);
authorView.setText(post.author);
numStarsView.setText(String.valueOf(post.starCount));
bodyView.setText(post.body);

starView.setOnClickListener(starClickListener);




$ b $ p $这是Post.java

  @IgnoreExtraProperties 
public class Post
{
public String uid;
public String author;
public String title;
public String body;
public int starCount = 0;
公共字符串类型;

public Map< String,Boolean> stars = new HashMap<>();

public Post()
{
}

public Post(String uid,String author,String title,String body,String type)
{
this.uid = uid;
this.author = author;
this.title = title;
this.body = body;
this.type = type;
}

@Exclude
public Map< String,Object> toMap()
{
HashMap< String,Object> result = new HashMap<>();
result.put(uid,uid);
result.put(author,author);
result.put(title,title);
result.put(body,body);
result.put(starCount,starCount);
result.put(stars,stars);
result.put(type,type);

返回结果;
}

}

非常感谢您的阅读。我创建了一个程序来搜索帖子的标题。当我在EditText中键入标题,然后按搜索按钮,我toast1测试,toast2测试和toast3测试给出正确和相同的值,它成功地列出我想要查询。但问题是,当我删除以前的文本后,在EditText中键入不同的文本,然后按Enter,Toast3测试(在FragmentSearch.java)保持不变,不会改变值。所以,它只是给出了以前的结果,没有改变的结果。任何人都可以帮助我吗?谢谢!

解决方案

问题是您只更改 FragmentSearch 构造函数。而这个构造函数只调用一次,而不是当你按下Enter键。

您应该更改您的 getQuery 方法以将此值作为参数。



在您的MainFragment.java上:

  public abstract Query getQuery DatabaseReference databaseReference,String value); 

在您的FragmentSearch.java上:

  @Override 
public Query getQuery(DatabaseReference databaseReference,String value)
{
this.value = value;
Toast.makeText(getActivity()。this,value test 3:+ value,Toast.LENGTH_LONG).show();
查询postsQuery = databaseReference.child(Post)。orderByChild(title)。equalTo(value);

return postsQuery;
}


This is SearchActivity.java

public class SearchActivity extends AppCompatActivity
{
    /*UI*/
    private EditText mSearchText;
    private Button mSearchBtn;
    private Toolbar mSearchToolbar;

    private FragmentPagerAdapter mPagerAdapter;
    private ViewPager mViewPager;

    private String value;

    private TextWatcher tw;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        mSearchText = (EditText)findViewById(R.id.activity_search_search_text);
        mSearchBtn = (Button)findViewById(R.id.activity_search_search_btn);

        mSearchToolbar = (Toolbar)findViewById(R.id.activity_search_toolbar);
        setSupportActionBar(mSearchToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle(null);

        mSearchBtn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                value = mSearchText.getText().toString();
                Toast.makeText(SearchActivity.this, "value test 1: " + value, Toast.LENGTH_LONG).show();
                searchText(value);
            }
        });
    }

    private void searchText(final String value)
    {
        Toast.makeText(SearchActivity.this, "value test 2: " + value, Toast.LENGTH_LONG).show();
        mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
        {
            private final Fragment[] mFragments = new Fragment[]
                    {
                            new FragmentSearch(value)
                    };

            @Override
            public Fragment getItem(int position)
            {
                return mFragments[position];
            }

            @Override
            public int getCount()
            {
                return mFragments.length;
            }
        };
        mViewPager = (ViewPager) findViewById(R.id.activity_search_view_pager);
        mViewPager.setAdapter(mPagerAdapter);
    }
}

This is FragmentSearch.java

public class FragmentSearch extends MainFragment
{
    public String value;

    public FragmentSearch(String value)
    {
        this.value = value;
    }

    @Override
    public Query getQuery(DatabaseReference databaseReference)
    {
        Toast.makeText(getActivity().this, "value test 3: " + value, Toast.LENGTH_LONG).show();
        Query postsQuery = databaseReference.child("Post").orderByChild("title").equalTo(value);

        return postsQuery;
    }
}

This is MainFragment.java

public abstract class MainFragment extends Fragment
{
    private DatabaseReference mDatabase;

    private FirebaseRecyclerAdapter<Post, PostViewHolder> mAdapter;
    private RecyclerView mRecycler;
    private LinearLayoutManager mManager;

    public MainFragment()
    {

    }

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

        mDatabase = FirebaseDatabase.getInstance().getReference();

        mRecycler = (RecyclerView)rootView.findViewById(R.id.messages_list);
        mRecycler.setHasFixedSize(true);

        return rootView;
    }

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

        mManager = new LinearLayoutManager(getActivity());
        mManager.setReverseLayout(true);
        mManager.setStackFromEnd(true);
        mRecycler.setLayoutManager(mManager);

        Query postsQuery = getQuery(mDatabase);

        mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post,
                PostViewHolder.class, postsQuery)
        {
            @Override
            protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position)
            {
                final DatabaseReference postRef = getRef(position);

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

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

                viewHolder.bindToPost(model, new View.OnClickListener()
                {
                    @Override
                    public void onClick(View starView)
                    {
                        DatabaseReference globalPostRef = mDatabase.child("Post").child(postRef.getKey());
                        DatabaseReference userPostRef = mDatabase.child("UserPost").child(model.uid).child(postRef.getKey());

                        onStarClicked(globalPostRef);
                        onStarClicked(userPostRef);
                    }
                });
            }
        };
        mRecycler.setAdapter(mAdapter);
    }

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

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

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

    public abstract Query getQuery(DatabaseReference databaseReference);

}

This is PostViewHolder.java

public class PostViewHolder extends RecyclerView.ViewHolder
{
    public TextView titleView;
    public TextView authorView;
    public ImageView starView;
    public TextView numStarsView;
    public TextView bodyView;

    public PostViewHolder(View itemView)
    {
        super(itemView);

        titleView = (TextView) itemView.findViewById(R.id.post_title);
        authorView = (TextView) itemView.findViewById(R.id.post_author);
        starView = (ImageView) itemView.findViewById(R.id.star);
        numStarsView = (TextView) itemView.findViewById(R.id.post_num_stars);
        bodyView = (TextView) itemView.findViewById(R.id.post_body);
    }

    public void bindToPost(Post post, View.OnClickListener starClickListener)
    {
        titleView.setText(post.title);
        authorView.setText(post.author);
        numStarsView.setText(String.valueOf(post.starCount));
        bodyView.setText(post.body);

        starView.setOnClickListener(starClickListener);
    }
}

This is Post.java

@IgnoreExtraProperties
public class Post
{
    public String uid;
    public String author;
    public String title;
    public String body;
    public int starCount = 0;
    public String type;

    public Map<String, Boolean> stars = new HashMap<>();

    public Post()
    {
    }

    public Post(String uid, String author, String title, String body, String type)
    {
        this.uid = uid;
        this.author = author;
        this.title = title;
        this.body = body;
        this.type = type;
    }

    @Exclude
    public Map<String, Object> toMap()
    {
        HashMap<String, Object> result = new HashMap<>();
        result.put("uid", uid);
        result.put("author", author);
        result.put("title", title);
        result.put("body", body);
        result.put("starCount", starCount);
        result.put("stars", stars);
        result.put("type", type);

        return result;
    }

}

Thank you so much for reading. I created a program to search title of the posts. When I type title in the EditText then press Search button, my toast1 test, toast2 test, and toast3 test give correct and same value and it successfully lists what I want with Query. But the problem is that when I type different text in EditText after deleting the previous text then press enter, toast3 test(in FragmentSearch.java) stays the same and does not change value. So, it just gives the previous result, not changed result. Can anyone assist me with this? Thank you!

解决方案

The problem is that you only change the value on the FragmentSearch constructor. And this constructor is only called once, and not when you press Enter.

You should change your getQuery method to have this value as a parameter.

On your MainFragment.java:

public abstract Query getQuery(DatabaseReference databaseReference, String value);

On your FragmentSearch.java:

@Override
    public Query getQuery(DatabaseReference databaseReference, String value)
    {
        this.value = value;
        Toast.makeText(getActivity().this, "value test 3: " + value, Toast.LENGTH_LONG).show();
        Query postsQuery = databaseReference.child("Post").orderByChild("title").equalTo(value);

        return postsQuery;
    }

这篇关于Android的Firebase查询搜索标题问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆