2017-02-09 6 views
0

Это SearchActivity.javaAndroid firebase поисковый запрос название выпуск

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

Это 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; 
    } 
} 

Это 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); 

} 

Это 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); 
    } 
} 

Это 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; 
    } 

} 

Большое вам спасибо за чтение. Я создал программу для поиска заголовков сообщений. Когда я печатаю название в EditText, а затем нажмите кнопку «Поиск», мой тест toast1, тест toast2 и тест toast3 дают правильное и то же значение, и он успешно перечисляет то, что я хочу с помощью Query. Но проблема в том, что когда я набираю текст в EditText после удаления предыдущего текста, затем нажмите Enter, toast3 test (в FragmentSearch.java) останется неизменным и не изменит значение. Таким образом, он просто дает предыдущий результат, а не изменяет результат. Может ли кто-нибудь помочь мне в этом? Спасибо!

+0

Пожалуйста, добавьте ваш файл MainFragment.java –

+0

Я только что загрузил MainFragment.java. Спасибо. – Eric

ответ

0

Проблема в том, что вы изменяете значение только для конструктора 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(); 
     Query postsQuery = databaseReference.child("Post").orderByChild("title").equalTo(value); 

     return postsQuery; 
    } 
+0

Благодарим вас за ответ на Rosario !, но как насчет Query postsQuery = getQuery (mDatabase); в моем классе MainFragment.java? – Eric

+0

Я поместил строковое значение в getQuery (mDatabase, (anystring)), но тест 3 теперь дает null. – Eric

 Смежные вопросы

  • Нет связанных вопросов^_^