Search Functionality for Listview

前端 未结 3 1511
无人及你
无人及你 2020-12-06 08:18

i\'m new to android. I\'m just trying to make one simple search functionality for my app. My app consists one ListView one EditText and one B

相关标签:
3条回答
  • 2020-12-06 08:22

    I had asked a similar kinda question a while back. Here: Filtering a ListView with Baseadapter filters text not images. Although, my specific question concerned a GridView, the concept (and the code) can be substituted for a ListView.

    NOTE: This will be a lengthy post but I think necessary for the sake of completeness (I am leaving out the imports though)

    The main activity (Friends.java)

    public class Friends extends SherlockActivity {
    
        // BUNDLE OBJECT TO GET DATA FROM EARLIER ACTIVITY
        Bundle extras;
    
        // INITIAL ALBUM ID AND NAME
        String initialUserID;
    
        // THE GRIDVIEW
        GridView gridOfFriends;
    
        // THE ADAPTER
        FriendsAdapter adapter;
    
        // ARRAYLIST TO HOLD DATA
        ArrayList<getFriends> arrFriends;
    
        // LINEARLAYOUT TO SHOW THE FOOTER PROGRESS BAR
        LinearLayout linlaProgressBar;
    
        // THE EDITTEXT TO FILTER USERS
        EditText filterText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.friends_grid_list);
    
            extras = getIntent().getExtras();
    
            if (extras.containsKey("USER_ID"))  {
                initialUserID = extras.getString("USER_ID");
            } else {
                Toast.makeText(
                        getApplicationContext(), 
                        "There was a problem getting your Friends Data. Please hit the back button and try again.", 
                        Toast.LENGTH_SHORT).show();
            }
    
            ActionBar actionBar = getSupportActionBar();
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setDisplayShowHomeEnabled(true);
            actionBar.setDisplayShowTitleEnabled(true);
            actionBar.setTitle("Your Friends");
    
            // CAST THE GRIDVIEW
            gridOfFriends = (GridView) findViewById(R.id.gridFriends);
    
            // INSTANTIATE THE ARRAYLIST
            arrFriends = new ArrayList<getFriends>();
    
            // CAST THE ADAPTER
            adapter = new FriendsAdapter(Friends.this, arrFriends);
    
            // CAST THE LINEARLAYOUT THAT HOLDS THE PROGRESS BAR
            linlaProgressBar = (LinearLayout) findViewById(R.id.linlaProgressBar);
            linlaProgressBar.setVisibility(View.GONE);
    
            // GET THE LOGGED IN USERS FRIENDS DATA
            if (initialUserID != null)  {
                new getFriendsData().execute();
            } else {
                Toast.makeText(
                        getApplicationContext(), 
                        "There was a problem getting your Friends Data. Please hit the back button and try again.", 
                        Toast.LENGTH_SHORT).show();
            }
    
            // CAST THE EDITTEXT AND SETUP FILTERING
            filterText = (EditText) findViewById(R.id.editFilterList);
            filterText.addTextChangedListener(filterTextWatcher);
        }
    
        private class getFriendsData extends AsyncTask<Void, Void, Void>    {
    
            @Override
            protected void onPreExecute() {
    
                // SHOW THE BOTTOM PROGRESS BAR (SPINNER) WHILE LOADING THE FRIENDS LIST
                linlaProgressBar.setVisibility(View.VISIBLE);
            }
    
            @Override
            protected Void doInBackground(Void... params) {
    
                try {
                    String query = 
                            "SELECT name, uid, pic_big " +
                            "FROM user " +
                            "WHERE uid in " +
                            "(SELECT uid2 FROM friend WHERE uid1=me()) " +
                            "order by name";
                    Bundle paramGetFriendsList = new Bundle();
                    paramGetFriendsList.putString("method", "fql.query");
                    paramGetFriendsList.putString("query", query);
    
                    String resultFriendsList = Utility.mFacebook.request(paramGetFriendsList);
    
                    JSONArray JAFriends = new JSONArray(resultFriendsList);
    
                    getFriends friends;
    
                    if (JAFriends.length() == 0)    {
    
                    } else {
                        for (int i = 0; i < JAFriends.length(); i++) {
                            JSONObject JOFriends = JAFriends.getJSONObject(i);
    
                            friends = new getFriends();
    
                            // SET FRIENDS ID
                            if (JOFriends.has("uid"))   {
                                friends.setFriendID(JOFriends.getString("uid"));
                            } else {
                                friends.setFriendID(null);
                            }
    
                            // SET FRIENDS NAME
                            if (JOFriends.has("name"))  {
                                friends.setFriendName(JOFriends.getString("name"));
                            } else {
                                friends.setFriendName(null);
                            }
    
                            // SET FRIENDS PROFILE PICTURE
                            if (JOFriends.has("pic_big"))   {
                                friends.setFriendProfile(JOFriends.getString("pic_big"));
                            } else {
                                friends.setFriendProfile(null);
                            }
    
                            arrFriends.add(friends);
    
                        }
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                return null;
            }
    
            @Override
            protected void onPostExecute(Void result) {
    
                // SET THE ADAPTER TO THE GRIDVIEW
                gridOfFriends.setAdapter(adapter);
    
                // HIDE THE BOTTOM PROGRESS BAR (SPINNER) AFTER LOADING THE FRIENDS LIST
                linlaProgressBar.setVisibility(View.GONE);
            }
    
        }
    
        private TextWatcher filterTextWatcher = new TextWatcher() {
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                adapter.getFilter().filter(s.toString().toLowerCase());
                adapter.notifyDataSetChanged();
            }
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
    
            }
        };
    }
    

    The getFriends.java class for the ArrayList:

    public class getFriends {
    
        String friendID;
        String friendName;
        String friendProfile;
    
        // SET FRIENDS ID
        public void setFriendID(String friendID) {
            this.friendID = friendID;
        }
    
        // GET FRIENDS ID
        public String getFriendID() {
            return friendID;
        }
    
        // SET FRIENDS NAME
        public void setFriendName(String friendName) {
            this.friendName = friendName;
        }
    
        // GET FRIENDS NAME
        public String getFriendName() {
            return friendName;
        }
    
        // SET FRIENDS PROFILE
        public void setFriendProfile(String friendProfile) {
            this.friendProfile = friendProfile;
        }
    
        // GET FRIENDS PROFILE
        public String getFriendProfile() {
            return friendProfile;
        }
    }
    

    And finally, the adapter class (FriendsAdapter.java)

    public class FriendsAdapter extends BaseAdapter implements Filterable {
    
        ProgressDialog dialog;
    
        Activity activity;
    
        LayoutInflater inflater = null;
        ImageLoader imageLoader;
    
        ArrayList<getFriends> arrayFriends;
        List<getFriends> mOriginalNames;
    
        FriendsAdapter(Activity a, ArrayList<getFriends> arrFriends) {
    
            activity = a;
    
            arrayFriends = arrFriends;
    
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            imageLoader = new ImageLoader(activity.getApplicationContext());
        }
    
        public int getCount() {
            return arrayFriends.size();
        }
    
        public Object getItem(int position) {
            return arrayFriends.get(position);
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public void notifyDataSetChanged() {
            super.notifyDataSetChanged();
        }
    
        public View getView(final int position, View convertView, ViewGroup parent) {
            View vi = convertView;
            if (convertView == null)
                vi = inflater.inflate(R.layout.friends_grid_items, null);
    
            ImageView imgProfilePicture = (ImageView) vi.findViewById(R.id.imgProfilePicture);
            TextView txtUserName = (TextView) vi.findViewById(R.id.txtUserName);
            FrameLayout mainContainer = (FrameLayout) vi.findViewById(R.id.mainContainer);
    
    
            txtUserName.setText(arrayFriends.get(position).getFriendName());
    
            if (arrayFriends.get(position).getFriendProfile() != null) {
                imageLoader.DisplayImage(arrayFriends.get(position).getFriendProfile(),imgProfilePicture);
            } else if (arrayFriends.get(position).getFriendProfile() == null) {
                imgProfilePicture.setVisibility(View.GONE);
            }
    
            mainContainer.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Intent showFriendsProfile = new Intent(activity.getApplicationContext(), UserProfileNew.class);
                    showFriendsProfile.putExtra("USER_ID", arrayFriends.get(position).getFriendID());
                    showFriendsProfile.putExtra("NAME", arrayFriends.get(position).getFriendName());
                    activity.startActivity(showFriendsProfile);
                }
            });
    
            return vi;
        }
    
        @Override
        public Filter getFilter() {
    
            Filter filter = new Filter() {
    
                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint,
                        FilterResults results) {
    
                    arrayFriends = (ArrayList<getFriends>) results.values;
                    notifyDataSetChanged();
                }
    
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
    
                    FilterResults results = new FilterResults();
                    ArrayList<getFriends> FilteredArrayNames = new ArrayList<getFriends>();
    
                    if (mOriginalNames == null) {
                        mOriginalNames = new ArrayList<getFriends>(arrayFriends);
                    }
                    if (constraint == null || constraint.length() == 0) {
                        results.count = mOriginalNames.size();
                        results.values = mOriginalNames;
                    } else {
                        constraint = constraint.toString().toLowerCase();
                        for (int i = 0; i < mOriginalNames.size(); i++) {
                            getFriends dataNames = mOriginalNames.get(i);
                            if (dataNames.getFriendName().toLowerCase()
                                    .contains(constraint.toString())) {
                                FilteredArrayNames.add(dataNames);
                            }
                        }
    
                        results.count = FilteredArrayNames.size();
                        // System.out.println(results.count);
    
                        results.values = FilteredArrayNames;
                        // Log.e("VALUES", results.values.toString());
                    }
    
                    return results;
                }
            };
    
            return filter;
        }
    }
    

    You can use the concept here and substitute for your ListView. I have used this elsewhere for a ListView and works as it should. Unfortunately, I cannot give that code away on a public fora. Hope this helps you though. Again, a very lengthy post no doubt, but necessary I believe.

    0 讨论(0)
  • 2020-12-06 08:36

    check this List View with easy searching in Android

    0 讨论(0)
  • 2020-12-06 08:45

    you may use Auto completer with your Editext and using that update your List Adapter and Also see

    <yourEditText>.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                <requery/filter your adapter then set it to your listview>
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // TODO Auto-generated method stub
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub
    
                }
            });
    
    0 讨论(0)
提交回复
热议问题