2016-07-19 64 views
0

我是Android新手,我的ListBooks我從我的FirebaseDatabase中檢索所有書籍,並且非常清楚地看到它,但是當我使用搜索功能時,我的列表不正確。我不知道爲什麼。 非常感謝您的幫助。帶editText的搜索功能 - ListView

ListBooks:

public class ListBooks extends AppCompatActivity { 

    EditText searchBooks; 
    Context mContext; 
    static final String KEY = "KEY", TAG_LOGIN = "TAG_LOGIN"; 
    String key, getTagLogin; 

    String user_name, searchSth; 
    DatabaseReference user; 
    DatabaseReference userBook = FirebaseDatabase.getInstance().getReference("Books").child("User's books"); 
    ListView mListView; 
    ArrayList<String> mArrayUserName = new ArrayList<>(); 
    ArrayList<String> mArrayTitle = new ArrayList<>(); 
    ArrayList<String> mArrayAuthor = new ArrayList<>(); 
    ArrayList<String> mArrayPrice = new ArrayList<>(); 
    ArrayList<String> mArrayImage = new ArrayList<>(); 
    customAdapter customAdapter; 


    @RequiresApi(api = Build.VERSION_CODES.KITKAT) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_books); 
     mContext = this; 



     Intent intent = getIntent(); 
     key = intent.getStringExtra(KEY); 
     getTagLogin = intent.getStringExtra(TAG_LOGIN); 



     mListView = (ListView) findViewById(R.id.recyclerView); 

     customAdapter = new customAdapter(mContext, mArrayTitle, mArrayAuthor, mArrayUserName, mArrayPrice, mArrayImage); 
     mListView.setAdapter(customAdapter); 

     userBook.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       UserBook userBook = dataSnapshot.getValue(UserBook.class); 
       user_name = userBook.user_name; 
       String book_title = userBook.book_title; 
       String book_author = userBook.book_author; 
       String book_price = userBook.book_price; 
       String book_cover = userBook.book_urlImage; 


       mArrayUserName.add(user_name); 
       mArrayTitle.add(book_title); 
       mArrayAuthor.add(book_author); 
       mArrayPrice.add(book_price); 
       mArrayImage.add(book_cover); 
       customAdapter.notifyDataSetChanged(); 

      } 
      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 


     searchBooks = (EditText) findViewById(R.id.search_books); 

     searchBooks.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       customAdapter.clear(); 
       searchSth = searchBooks.getText().toString(); 

      } 

      @Override 
      public void afterTextChanged(Editable editable) { 
       userBook.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         for(DataSnapshot snapshot: dataSnapshot.getChildren()){ 
          UserBook userBook = snapshot.getValue(UserBook.class); 
          String book_title = userBook.book_title; 
          if (book_title.contains(searchSth) && searchSth != null){ 
           user_name = userBook.user_name; 
           String book_author = userBook.book_author; 
           String book_price = userBook.book_price; 
           String book_cover = userBook.book_urlImage; 


           mArrayUserName.add(user_name); 
           mArrayTitle.add(book_title); 
           mArrayAuthor.add(book_author); 
           mArrayPrice.add(book_price); 
           mArrayImage.add(book_cover); 
           customAdapter.notifyDataSetChanged(); 
          } 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     }); 




    } 

} 

customAdapter.java:

public class customAdapter extends ArrayAdapter<String>{ 

    Context mContext; 
    ArrayList<String> user_name; 
    ArrayList<String> book_title; 
    ArrayList<String> book_author; 
    ArrayList<String> book_price; 
    ArrayList<String> book_cover; 


    public customAdapter(Context context, ArrayList<String> user_name, ArrayList<String> book_title, 
         ArrayList<String> book_author, ArrayList<String> book_price, ArrayList<String> book_cover) { 
     super(context, R.layout.row_list_books, book_title); 
     // TODO Auto-generated constructor stub 

     this.mContext = context; 
     this.user_name = user_name; 
     this.book_title = book_title; 
     this.book_author = book_author; 
     this.book_price = book_price; 
     this.book_cover = book_cover; 
    } 

    public View getView(int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(mContext); 
     View rowView = inflater.inflate(R.layout.row_list_books, null, true); 

     TextView user = (TextView) rowView.findViewById(R.id.user_name_search); 
     TextView title = (TextView) rowView.findViewById(R.id.bookTitle); 
     TextView author = (TextView) rowView.findViewById(R.id.bookAuthor); 
     TextView price = (TextView) rowView.findViewById(R.id.priceBook); 
     ImageView bookImage = (ImageView) rowView.findViewById(R.id.coverBookSearch); 


      user.setText(user_name.get(position)); 
      title.setText(book_title.get(position)); 
      author.setText(book_author.get(position)); 
      price.setText(book_price.get(position)); 
      if (book_cover.get(position).startsWith("https://")) { 
       Picasso.with(mContext).load(book_cover.get(position)).into(bookImage); 
      } else { 
       bookImage.setImageBitmap(StringToBitMap(book_cover.get(position))); 
      } 


     return rowView; 

    } 





    //Transform a String in a Bitmap Image (used with camera) 
    public Bitmap StringToBitMap(String encodedString){ 
     try { 
      byte [] encodeByte= Base64.decode(encodedString, Base64.DEFAULT); 
      Bitmap bitmap= BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length); 
      return bitmap; 
     } catch(Exception e) { 
      e.getMessage(); 
      return null; 
     } 
    } 
} 

UserBook:

public class UserBook { 

    public String user_key; 
    public String user_tag_login; 
    public String book_title; 
    public String book_author; 
    public String book_urlImage; 
    public String book_publisher; 
    public String book_price; 
    public String user_name; 

    public UserBook() { 
     // Default constructor required for calls to DataSnapshot.getValue(User.class) 
    } 

    public UserBook(String user_name, String user_key, String user_tag_login, String book_title, String book_author, String book_urlImage, String book_publisher, String book_price) { 
     this.user_name = user_name; 
     this.user_key = user_key; 
     this.user_tag_login = user_tag_login; 
     this.book_title = book_title; 
     this.book_author = book_author; 
     this.book_urlImage = book_urlImage; 
     this.book_publisher = book_publisher; 
     this.book_price = book_price; 
    } 


} 
+1

製作一個Book類對象來保存所有這些字符串。不要把一堆單獨的串列表串在一起。 –

+0

我有一本書對象。我在我的問題中更新了這個對象。但是,我如何把對象放在我的列表視圖中? – Carlo

+1

製作一個'BookAdapter extends ArrayAdapter ',它存儲一個'ArrayList '。 –

回答

1

無保證這將解決搜索問題,但它肯定會降低代碼的複雜性。

更換所有這些

ArrayList<String> user_name; 
ArrayList<String> book_title; 
ArrayList<String> book_author; 
ArrayList<String> book_price; 
ArrayList<String> book_cover; 

隨着這些

ArrayList<UserBook> books; 

然後

public class customAdapter extends ArrayAdapter<UserBook> 

並且更改了所有的其他邏輯在適配器顯示書的對象。