Я пытаюсь найти пользователей по их имени в базе данных Fire-base, но когда я ввожу имя пользователя в поле поиска, отображается пустой список. Вот что я сделал до сих пор.
SearchActivity. java
package com.example.logindesign;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.example.logindesign.UserListAdapter;
import com.example.logindesign.users;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
/**
* Created by User on 5/28/2017.
*/
public class SearchActivity extends AppCompatActivity {
private static final String TAG = "SearchActivity";
private static final int ACTIVITY_NUM = 1;
private Context mContext = SearchActivity.this;
//widgets
private EditText mSearchParam;
private ListView mListView;
//vars
private List<users> mUserList;
UserListAdapter mAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
mSearchParam = (EditText) findViewById(R.id.search);
mListView = (ListView) findViewById(R.id.listView);
Log.d(TAG, "onCreate: started.");
hideSoftKeyboard();
initTextListener();
}
private void initTextListener(){
Log.d(TAG, "initTextListener: initializing");
mUserList = new ArrayList<>();
mSearchParam.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String text = mSearchParam.getText().toString().toLowerCase(Locale.getDefault());
searchForMatch(text);
}
});
}
private void searchForMatch(String keyword){
Log.d(TAG, "searchForMatch: searching for a match: " + keyword);
mUserList.clear();
//update the users list view
if(keyword.length() ==0){
}else{
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("Users")
.orderByChild("Username").equalTo(keyword);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user:" + Objects.requireNonNull(Objects.requireNonNull(singleSnapshot.getValue(users.class)).toString()));
mUserList.add(singleSnapshot.getValue(users.class));
//update the users list view
updateUsersList();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
private void updateUsersList(){
Log.d(TAG, "updateUsersList: updating users list");
mAdapter = new UserListAdapter(SearchActivity.this, R.layout.layout_user_listitem, mUserList);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "onItemClick: selected user: " + mUserList.get(position).toString());
//navigate to profile activity
}
});
}
private void hideSoftKeyboard(){
if(getCurrentFocus() != null){
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
}
UserListAdapter. java
package com.example.logindesign;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import java.util.List;
import java.util.Objects;
import de.hdodenhof.circleimageview.CircleImageView;
/**
* Created by User on 9/17/2017.
*/
public class UserListAdapter extends ArrayAdapter<users> {
private static final String TAG = "UserListAdapter";
private LayoutInflater mInflater;
List<users> mUsers = null;
private int layoutResource;
private Context mContext;
public UserListAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<users> objects) {
super(context, resource, objects);
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutResource = resource;
this.mUsers = objects;
}
private static class ViewHolder{
TextView username, email;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(layoutResource, parent, false);
holder = new ViewHolder();
holder.username = convertView.findViewById(R.id.username);
holder.email = convertView.findViewById(R.id.email);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.username.setText(Objects.requireNonNull(getItem(position)).getUsername());
holder.email.setText(Objects.requireNonNull(getItem(position)).getEmail());
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child("Users")
.orderByChild("Username")
.equalTo(Objects.requireNonNull(getItem(position)).getUser_id());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot: dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user: " +
Objects.requireNonNull(singleSnapshot.getValue(users.class)));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return convertView;
}
}
Результаты примерно такие. Если вы присмотритесь, то увидите, что есть информация для отображения информации, но каким-то образом она скрыта: