Filtering a ListView with Baseadapter filters text not images

后端 未结 4 1828
一向
一向 2020-12-18 07:29

There was some progress made to the earlier problem. Now there is a new problem. The text in the GridView shows the correct result. However, the images are the same as at th

相关标签:
4条回答
  • 2020-12-18 08:16

    @MKJParekh did a great job!To sum up his implementation:

    1. Declare a temporary List of objects at the beginning of the class that reflect the incoming data used for each item (1 object per item).
    2. In the performFiltering()set the condition for nulls and empty strings, and also if the constraint matches the string value of the corresponding object, then add the object to the temp List. That way you have only a "filtered" list of objects.
    3. Use data from your temp list, rather than your data source (as you normally would), for methods such as getCount(), getItem(), and getView(). Otherwise, you'll just be loading ALL the items everytime, since untimately notifyDataSetChanged() will be called after each filtering.
    0 讨论(0)
  • 2020-12-18 08:22

    First refactor your code. Create a class that holds name, picture and other friend data together.

    class Friend {
        public String name;
        public String picture;
        ... /* more members and access methods*/
    };
    

    Then modify your adapter and filtering code accordingly.

    • FilterResults should contain the ArrayList<Friend>, i.e. a list of Friend objects and not just the names.

    • In Adapter, replace

      List<String> arrayListNames;
      List<String> arrayPictures;

      with

      List<Friend> friendsList;

    • Change the getView method to access data from the friendsList object list.

    After these changes the code will look better and work better.

    Update:

    Make sure your adapter's getItem method returns a Friend object

    public Object getItem(int position) {
        return mFriendsList.get(position);
    }
    
    0 讨论(0)
  • 2020-12-18 08:25

    Try this:

    public class TagFriendsAdapter extends BaseAdapter implements Filterable
    {
    
        List<String> arrayListNames;
        List<String> mOriginalNames;
    
        List<String> arrayPictures;
        List<String> mOriginalPictures;
    
        Activity activity;
        String[] fetFriendID;
        String[] fetFriendName;
        String[] fetFriendPicture;
    
        LayoutInflater inflater = null;
        ImageLoader imageLoader;
    
        private Hashtable<String, String> picturesMap = new Hashtable<String, String>();
    
        public void setNamesAndPictures(List<String> arrayListNames, List<String> arrayPictures) {
            for(int i = 0; i < arrayListNames.size(); i++){
                picturesMap.put(arrayListNames.get(i), arrayPictures.get(i));
            }
    
            this.arrayListNames = arrayListNames;
        }
    
        TagFriendsAdapter(Activity a, String[] stringUID, String[] stringName, String[] stringPicture,
                ArrayList<String> arrayName, ArrayList<String> arrayPicture) {
    
            activity = a;
            fetFriendID = stringUID;
            fetFriendName = stringName;
            fetFriendPicture = stringPicture;
    
            this.arrayListNames = arrayName;
            this.arrayPictures = arrayPicture;
    
            inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            imageLoader = new ImageLoader(activity.getApplicationContext());
        }
    
        @Override
        public int getCount() {
            return arrayListNames.size();
        }
    
        @Override
        public Object getItem(int position) {
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public void notifyDataSetChanged() {
            super.notifyDataSetChanged();
        }
    
        @Override
        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);
    
            txtUserName.setText(arrayListNames.get(position));
    
            String url = picturesMap.get(arrayListNames.get(position));
            if(url != null){
                imageLoader.DisplayImage(url, imgProfilePicture);
            }
            else if(arrayPictures.get(position) == null){
                imgProfilePicture.setVisibility(View.GONE);
            }
    
            return vi;
        }
    
        @Override
        public Filter getFilter() {
    
            Filter filter = new Filter() {
    
                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
    
                    arrayListNames = (List<String>) results.values;
                    notifyDataSetChanged();
                }
    
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
    
                    FilterResults results = new FilterResults();
                    ArrayList<String> FilteredArrayNames = new ArrayList<String>();
    
                    if(mOriginalNames == null && mOriginalPictures == null){
                        mOriginalNames = new ArrayList<String>(arrayListNames);
                        mOriginalPictures = new ArrayList<String>(arrayPictures);
                    }
                    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++){
                            String dataNames = mOriginalNames.get(i);
                            if(dataNames.toLowerCase().startsWith(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;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-18 08:27

    Problem is because you are not updating the list of picture names while you filter the array based on edittext input, you also need to update them too,

    I have tried to modify your code,check this

        public static List<String> temparrayPictures; 
        public static List<String> temparrayListNames; 
        public class TagFriendsAdapter extends BaseAdapter implements Filterable { 
    
            List<String> arrayListNames; 
            List<String> arrayPictures; 
    
            Activity activity; 
            String[] fetFriendID; 
            String[] fetFriendName; 
            String[] fetFriendPicture; 
    
            LayoutInflater inflater = null; 
            ImageLoader imageLoader; 
    
            TagFriendsAdapter(Activity a, String[] stringUID, String[] stringName, String[] stringPicture, 
                    ArrayList<String> arrayName, ArrayList<String> arrayPicture) { 
    
                activity = a; 
                fetFriendID = stringUID; 
                fetFriendName = stringName; 
                fetFriendPicture = stringPicture; 
    
                this.arrayListNames = arrayName; 
                this.arrayPictures = arrayPicture; 
                temparrayPictures = arrayPicture;
                temparrayListNames = arrayName;
    
                inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
                imageLoader = new ImageLoader(activity.getApplicationContext()); 
            } 
    
            public int getCount() { 
                return temparrayListNames.size(); 
            } 
    
            public Object getItem(int position) { 
                return 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); 
    
                txtUserName.setText(temparrayListNames.get(position)); 
    
                if (temparrayPictures.get(position) != null){ 
                    imageLoader.DisplayImage(temparrayPictures.get(position), imgProfilePicture); 
                } 
                else if (temparrayPictures.get(position) == null) { 
                    imgProfilePicture.setVisibility(View.GONE); 
                } 
    
                return vi; 
            } 
    
            @Override 
            public Filter getFilter() { 
    
                Filter filter = new Filter() { 
    
                    @SuppressWarnings("unchecked") 
                    @Override 
                    protected void publishResults(CharSequence constraint, FilterResults results) { 
    
                        notifyDataSetChanged(); 
                    } 
    
                    @Override 
                    protected FilterResults performFiltering(CharSequence constraint) { 
    
                        FilterResults results = new FilterResults();
                        temparrayPictures.clear();
                        temparrayListNames.clear();
    
                        if (temparrayListNames == null && temparrayPictures == null)    { 
                            temparrayListNames = new ArrayList<String>(arrayListNames); 
                            temparrayPictures = new ArrayList<String>(arrayPictures); 
                        } 
                        if (constraint == null || constraint.length() == 0) { 
                            results.count = arrayListNames.size(); 
                            results.values = arrayListNames; 
    
                            temparrayPictures = arrayPictures;
                            temparrayListNames = arrayListNames;
                        } else { 
                            constraint = constraint.toString().toLowerCase(); 
                            for (int i = 0; i < mOriginalNames.size(); i++) { 
                                String dataNames = arrayName.get(i); 
                                String picNames =  arrayPicture.get(i);
                                if (dataNames.toLowerCase().startsWith(constraint.toString()))  { 
                                    temparrayPictures.add(picNames);
                                    temparrayListNames.add(dataNames);
                                } 
                            } 
    
                            results.count = temparrayListNames.size(); 
                            System.out.println(results.count); 
    
                            results.values = temparrayListNames; 
                            Log.e("VALUES", results.values.toString()); 
                        } 
    
                        return results; 
                    } 
                }; 
    
                return filter; 
            } 
    
        } 
    
    0 讨论(0)
提交回复
热议问题