我的SearchActivity不会向用户显示。没有显示错误,但是searchForMatch和updateUsersList之间一定有问题,因为在logcat中显示的最后一个日志是(TAG,“searchForMatch:搜索匹配:”+关键字);我觉得那段代码肯定有问题,但我不知道:(也许Firebase出了问题?请帮忙。
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
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.ittianyu.bottomnavigationviewex.BottomNavigationViewEx;
import com.stek.ca_ltd.memestackupdating.Profile.ProfileActivity;
import com.stek.ca_ltd.memestackupdating.R;
import com.stek.ca_ltd.memestackupdating.Utils.BottomNavigationViewHelper;
import com.stek.ca_ltd.memestackupdating.Utils.UserListAdapter;
import com.stek.ca_ltd.memestackupdating.models.User;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/**
* 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<User> mUserList;
private 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();
setupBottomNavigationView();
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(getString(R.string.dbname_users))
.orderByChild(getString(R.string.field_username)).equalTo(keyword);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user:" + singleSnapshot.getValue(User.class).toString());
mUserList.add(singleSnapshot.getValue(User.class));
//update the users list view
updateUsersList();
}
}
@Override
public void onCancelled(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
Intent intent = new Intent(SearchActivity.this, ProfileActivity.class);
intent.putExtra(getString(R.string.calling_activity), getString(R.string.search_activity));
intent.putExtra(getString(R.string.intent_user), mUserList.get(position));
startActivity(intent);
}
});
}
private void hideSoftKeyboard(){
if(getCurrentFocus() != null){
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
/**
* BottomNavigationView setup
*/
private void setupBottomNavigationView(){
Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx) findViewById(R.id.bottomNavViewBar);
BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
BottomNavigationViewHelper.enableNavigation(mContext, this,bottomNavigationViewEx);
Menu menu = bottomNavigationViewEx.getMenu();
MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
menuItem.setChecked(true);
}
}
和UserListAdapter:
import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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 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.stek.ca_ltd.memestackupdating.R;
import com.stek.ca_ltd.memestackupdating.models.User;
import com.stek.ca_ltd.memestackupdating.models.UserAccountSettings;
import java.util.List;
import de.hdodenhof.circleimageview.CircleImageView;
/**
* Created by User on 9/17/2017.
*/
public class UserListAdapter extends ArrayAdapter<User>{
private static final String TAG = "UserListAdapter";
private LayoutInflater mInflater;
private List<User> mUsers = null;
private int layoutResource;
private Context mContext;
public UserListAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<User> 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;
CircleImageView profileImage;
}
@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 = (TextView) convertView.findViewById(R.id.username);
holder.email = (TextView) convertView.findViewById(R.id.email);
holder.profileImage = (CircleImageView) convertView.findViewById(R.id.profile_image);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.username.setText(mUsers.get(position).getUsername());
holder.email.setText(getItem(position).getEmail());
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child(mContext.getString(R.string.dbname_user_account_settings))
.orderByChild(mContext.getString(R.string.field_user_id))
.equalTo(getItem(position).getUser_id());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot: dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user: " +
singleSnapshot.getValue(UserAccountSettings.class).toString());
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(singleSnapshot.getValue(UserAccountSettings.class).getProfile_photo(),
holder.profileImage);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return convertView;
}
}
答案 0 :(得分:0)
我认为您在活动中采取了一些错误的步骤。您正在多次初始化适配器,如果搜索字符串为空,您还清除用户arraylist。我的下面的代码可以帮助您。
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
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.ittianyu.bottomnavigationviewex.BottomNavigationViewEx;
import com.stek.ca_ltd.memestackupdating.Profile.ProfileActivity;
import com.stek.ca_ltd.memestackupdating.R;
import com.stek.ca_ltd.memestackupdating.Utils.BottomNavigationViewHelper;
import com.stek.ca_ltd.memestackupdating.Utils.UserListAdapter;
import com.stek.ca_ltd.memestackupdating.models.User;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
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<User> mUserList;
private List<User> mUserListTemp;
private 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.");
mUserList = new ArrayList<>();
mUserListTemp = new ArrayList<>();
mAdapter = new UserListAdapter(SearchActivity.this, R.layout.layout_user_listitem, mUserList);
mListView.setAdapter(mAdapter);
hideSoftKeyboard();
setupBottomNavigationView();
initTextListener();
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
Intent intent = new Intent(SearchActivity.this, ProfileActivity.class);
intent.putExtra(getString(R.string.calling_activity), getString(R.string.search_activity));
intent.putExtra(getString(R.string.intent_user), mUserList.get(position));
startActivity(intent);
}
});
}
private void initTextListener(){
Log.d(TAG, "initTextListener: initializing");
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);
//update the users list view
if(keyword.length() ==0){
}else{
mUserListTemp.clear();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
Query query = reference.child(getString(R.string.dbname_users))
.orderByChild(getString(R.string.field_username)).equalTo(keyword);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
Log.d(TAG, "onDataChange: found user:" + singleSnapshot.getValue(User.class).toString());
mUserListTemp.add(singleSnapshot.getValue(User.class));
//update the users list view
}
updateUsersList();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
private void updateUsersList(){
Log.d(TAG, "updateUsersList: updating users list");
if(mUserListTemp.size()>0)
{
mUserList.clear();
mUserList.addAll(mUserListTemp);
mAdapter.notifyDataSetChanged();
}
}
private void hideSoftKeyboard(){
if(getCurrentFocus() != null){
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
/**
* BottomNavigationView setup
*/
private void setupBottomNavigationView(){
Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
BottomNavigationViewEx bottomNavigationViewEx = (BottomNavigationViewEx) findViewById(R.id.bottomNavViewBar);
BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
BottomNavigationViewHelper.enableNavigation(mContext, this,bottomNavigationViewEx);
Menu menu = bottomNavigationViewEx.getMenu();
MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
menuItem.setChecked(true);
}
}