Android unable to get the position of filtered listview

14 views Asked by At

i am having an error getting the exact position of my listview after i filter my adapter.

my activity oncreate is.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ListView folderList = findViewById(R.id.fl_list_view);
        List<FolderItem> folders = new ArrayList<>();
        File file = Environment.getExternalStorageDirectory();
        for(File f : file.listFiles()){
            if(f.isDirectory()){
                folders.add(new FolderItem(f));
            }
        }
        final FilesAdapter adapter = new FilesAdapter(this);
        folderList.setAdapter(adapter);
        folderList.setOnItemClickListener(new AdapterView.OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                String name = adapter.getFolders().get(position).name;
                Toast.makeText(getApplicationContext(),name,1).show();
            }
        });
    }

i have implement a simple filter method in adapter so everything is working fine here is my adapter

private class FilesAdapter extends ArrayAdapter<FolderItem>{
        private List<FolderItem> defaultItems;
        private List<FolderItem> folderItems;
        public FilesAdapter(Context context){
            super(context,R.layout.folder_list_item);
        }
        public void setFolders(List<FolderItem> folders){
            defaultItems=folders;
            folderItems=folders;
        }
        @Override
        public int getCount() {
            return folderItems.size();
        }
        public void filter(String query){
            //making the query small letters.
            query=query.toLowerCase();
            //restore the original list if query is empty.
            if(query.equals("")){
                folderItems.clear();
                folderItems.addAll(defaultItems);
            }
            //clear the items from list
            folderItems.clear();
            //check if our list contain query
            for(int i = 0; i < defaultItems.size(); i++){
                //get File name from list
                String name = defaultItems.get(i).name.toLowerCase();
                if(name.contains(query)){
                    //the name contains the query.
                    //now let add item to our list
                    folderItems.add(defaultItems.get(i));
                }
            }
            //now there is a need to update our adapter
            notifyDataSetChanged();
        }
        
        @Override
        public FolderItem getItem(int position) {
            return folderItems.get(position);
        }
        public List<FolderItem> getFolders(){
            return folderItems;
        }
        @Override
        public View getView(int position, View v, ViewGroup parent) {
            if(v==null){
                v=LayoutInflater.from(getContext()).inflate(R.layout.folder_list_item,parent,false);
            }
            TextView foldername = v.findViewById(R.id.fl_folder_name);
            TextView subfolders = v.findViewById(R.id.fl_folder_count);
            TextView datemodified = v.findViewById(R.id.fl_date_modified);
            FolderItem folderItem = getItem(position);
            foldername.setText(folderItem.name);
            subfolders.setText(folderItem.subFolders);
            datemodified.setText(folderItem.dateModified);
            return v;
        }
         
    }

and my folderitem class is

private class FolderItem {
        public String name;
        public String path;
        public String dateModified;
        public String subFolders;
        public FolderItem(File file){
            name=file.getName();
            path=file.getPath();
            dateModified=DateFormat.format("dd/MM/yyyy",file.lastModified()).toString();
            int size = 0;
            for(File f : file.listFiles()){
                if(f.isDirectory()){
                    size++;
                }
            }
            if(size>1){
                subFolders=size+" folders";
            }else if(size==1){
                subFolders=size+" folder";
            }else if(size==0){
                subFolders="empty folder";
            }
        }
    }

the value return is the same as defaultItems.get(position).name; (before filter the list) even when i use adapter.getFolder(); i want know if is there any way to get the current visible items position. thank.

0

There are 0 answers