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.