2016-07-19 10 views
0

Ich bin neu in Android, mit meinen ListBooks lese ich alle Bücher aus meiner FirebaseDatabase und ich sehe es sehr deutlich, aber wenn ich die Suchfunktion benutze ist meine Liste nicht korrekt. Ich weiß nicht warum. Vielen Dank im Voraus für Ihre Hilfe.Suchfunktion mit 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; 
     } 
    } 
} 

BENUTZERBÜCHER:

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

Erstellen Sie ein Buchklassenobjekt, das alle diese Zeichenfolgen enthält. Wirf keine einzelnen Strings zusammen. –

+0

Ich habe ein Buchobjekt. Ich aktualisiere das Objekt in meiner Frage. Aber wie stelle ich ein Objekt in meine Listenansicht? – Carlo

+1

Machen Sie ein 'BookAdapter erweitert ArrayAdapter ' speichert eine 'ArrayList '. –

Antwort

1

keine Garantien, dass Dies wird das Suchproblem beheben, aber es reduziert sicherlich die Komplexität des Codes.

Ersetzen Sie diese alle

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

mit einem dieser

ArrayList<UserBook> books; 

Dann

public class customAdapter extends ArrayAdapter<UserBook> 

und die andere Logik alle im Adapter für die Anzeige der Buchobjekt ändern aus.