2017-02-09 2 views
0

이것은 안드로이드 중포 기지 쿼리 검색 제목 문제

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

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입니다 FragmentSearch.java

입니다 SearchActivity.java

입니다

이 0

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

} 

가 읽어 주셔서 너무 감사 Post.java

입니다. 게시물의 제목을 검색하는 프로그램을 만들었습니다. EditText에 title을 입력하고 Search 버튼을 누르면 내 toast1 테스트, toast2 테스트 및 toast3 테스트가 정확하고 동일한 값을 제공하며 쿼리에서 원하는 것을 성공적으로 나열합니다. 하지만 문제는 이전 텍스트를 삭제 한 후 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에 답변 해 주셔서 감사합니다.하지만, queries postsQuery = getQuery (mDatabase); 내 MainFragment.java 클래스에? – Eric

+0

문자열 값을 getQuery (mDatabase, (anystring))에 넣었으나 테스트 3은 이제 null을 제공합니다. – Eric

관련 문제