【问题标题】:My SearchActivity does not show users while searching them我的 SearchActivity 在搜索用户时不显示用户
【发布时间】:2017-10-21 08:48:04
【问题描述】:

我的 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;
    }
}

【问题讨论】:

    标签: java android database firebase


    【解决方案1】:

    我认为您在活动中采取了一些错误的步骤。您正在多次初始化适配器,并且如果 serach 字符串为空,则清除您的用户数组列表。我的以下代码可能会对您有所帮助。

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

    【讨论】:

    • 由于错误“无法启动活动 ComponentInfo 导致崩溃:java.lang.NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()” "
    • 对不起我的错误。请多尝试。
    • 还是不行。我将发送我的 UserListAdapter.java 以便您查看:)
    • 干得好。抱歉迟了回应。问题出在哪里?
    • 不删除 toLowercase();我在 2 个月前设定做一些其他的事情,但我忘记了。它只搜索小写用户
    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 2021-09-29
    • 2021-03-23
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多