Android 调用函数后,我的ArrayList大小变为零(0)。我的错误在哪里?

Android 调用函数后,我的ArrayList大小变为零(0)。我的错误在哪里?,android,android-studio,Android,Android Studio,我正在尝试使用editText筛选recyclerView项。但每当我键入某个内容时,我的arrayList大小就会变为零(0)。我找不到这背后的原因。 常量类中的数组: public static ArrayList<File> searchItem = new ArrayList<>(); public static ArrayList<File> filteredMediaList = new ArrayList<>(); 过滤功能

我正在尝试使用editText筛选recyclerView项。但每当我键入某个内容时,我的arrayList大小就会变为零(0)。我找不到这背后的原因。
常量类中的数组:

    public static ArrayList<File> searchItem = new ArrayList<>();
public static ArrayList<File> filteredMediaList = new ArrayList<>();
过滤功能:

public void filter(String text){
    Log.d("searchQueryText",text);

    Constant.filteredMediaList.clear();
    Log.d("SearchFilteredMediaList","clear");

    if(text.length() == 0){
        Constant.filteredMediaList = mediaList;
        Log.d("SearchFilteredMediaList","mediaList");
    }
    else{
        for(File file:mediaList){
            if(file.getName().toLowerCase().contains(text)){
                Constant.filteredMediaList.add(file);
                Log.d("SearchFilteredMediaList","adding");
                 
            }
        }
    }
    Log.d("SearchAllSize",String.valueOf(Constant.searchItem.size())+" | "+
            String.valueOf(Constant.filteredMediaList.size())+" | "+
            String.valueOf(mediaList.size()));
    //everything becomes zero here
    recyclerViewAdapterSearch.notifyDataSetChanged();
}

调用filter函数后,所有arrayList都变为零。有人能帮我找到问题吗。

您已经创建了3个列表,我可以看到如下所述:

  • 搜索项
  • 过滤媒体
  • 媒体列表
  • 因此,一旦调用方法“load\u Directory\u Files\u Search”,它将填充列表搜索项并分配内存

    现在代码是:

    mediaList = Constant.searchItem;
    
    在这里,分配给searchItem的相同内存由mediaList引用。也就是说,这意味着没有为mediaList创建新内存。因此,对mediaList所做的任何更改也将影响searchItem

    之后,在下面提到的代码行中:

    Constant.filteredMediaList = mediaList;
    
    filterMediaList指的是mediaList指向的列表

    现在,您创建的所有3个列表searchItem、mediaList和filteredMediaList都指向相同的内存。因此,在任何列表中所做的更改都将更改所有3个列表

    由于您在filter()方法中提到了以下行:

    它会清除所有3个列表,这就是您清除列表的原因

    如果您不希望其他列表在对任何其他列表进行更改时生效,以下是执行此操作的方法

    我正在为下面的onCreate方法编写代码:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    editTextSearch = findViewById(R.id.editTextSearch);
    recyclerViewSearch = findViewById(R.id.recyclerViewSearch);
    
    allPath = new StoragePath(getExternalFilesDirs(null)).getDeviceStorages();
    for(String path:allPath){
        Log.d("allPath",path);
        File directory=new File(path);
        Method.load_Directory_Files_Search(directory);
    }
    mediaList = new ArrayList<>(searchItem);
    Constant.filteredMediaList = new ArrayList<>(searchItem);
    Log.d("SearchAllSize",String.valueOf(Constant.searchItem.size())+" | "+
            String.valueOf(Constant.filteredMediaList.size())+" | "+
            String.valueOf(mediaList.size()));
    
    //initializing everything above
    recyclerViewSearch.setLayoutManager(new LinearLayoutManager(this,RecyclerView.VERTICAL,false));
    recyclerViewAdapterSearch = new RecyclerViewAdapterSearch(this);
    recyclerViewSearch.setAdapter(recyclerViewAdapterSearch);
    Log.d("SearchAllSize",String.valueOf(Constant.searchItem.size())+" | "+
            String.valueOf(Constant.filteredMediaList.size())+" | "+
            String.valueOf(mediaList.size()));
    
     //working fine till now
    editTextSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
        @Override
        public void afterTextChanged(Editable editable) {
            String text = editable.toString();
            filter(text);
        }
    });
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity\u search);
    editTextSearch=findViewById(R.id.editTextSearch);
    recyclerViewSearch=findViewById(R.id.recyclerViewSearch);
    allPath=new-StoragePath(getExternalFilesDirs(null)).getDeviceStorage();
    for(字符串路径:allPath){
    Log.d(“所有路径”,路径);
    文件目录=新文件(路径);
    方法。加载\u目录\u文件\u搜索(目录);
    }
    mediaList=新的ArrayList(searchItem);
    Constant.filteredMediaList=newarraylist(searchItem);
    Log.d(“SearchAllSize”,String.valueOf(Constant.searchItem.size())+“|”+
    String.valueOf(Constant.filteredMediaList.size())+“|”+
    String.valueOf(mediaList.size());
    //初始化上面的一切
    recyclerViewSearch.setLayoutManager(新的LinearLayoutManager(this,RecyclerView.VERTICAL,false));
    RecycleServiceAdapterSearch=新的RecycleServiceAdapterSearch(此);
    setAdapter(RecycleServiceAdapterSearch);
    Log.d(“SearchAllSize”,String.valueOf(Constant.searchItem.size())+“|”+
    String.valueOf(Constant.filteredMediaList.size())+“|”+
    String.valueOf(mediaList.size());
    //工作到现在还不错
    editTextSearch.addTextChangedListener(新的TextWatcher(){
    @凌驾
    更改前的公共无效(CharSequence CharSequence,int i,int i1,int i2){
    }
    @凌驾
    public void onTextChanged(CharSequence CharSequence,int i,int i1,int i2){
    }
    @凌驾
    public void PostTextChanged(可编辑){
    字符串文本=可编辑的.toString();
    过滤器(文本);
    }
    });
    
    我希望这个解决方案能帮助你

    Constant.filteredMediaList = mediaList;
    
    Constant.filteredMediaList.clear();
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    editTextSearch = findViewById(R.id.editTextSearch);
    recyclerViewSearch = findViewById(R.id.recyclerViewSearch);
    
    allPath = new StoragePath(getExternalFilesDirs(null)).getDeviceStorages();
    for(String path:allPath){
        Log.d("allPath",path);
        File directory=new File(path);
        Method.load_Directory_Files_Search(directory);
    }
    mediaList = new ArrayList<>(searchItem);
    Constant.filteredMediaList = new ArrayList<>(searchItem);
    Log.d("SearchAllSize",String.valueOf(Constant.searchItem.size())+" | "+
            String.valueOf(Constant.filteredMediaList.size())+" | "+
            String.valueOf(mediaList.size()));
    
    //initializing everything above
    recyclerViewSearch.setLayoutManager(new LinearLayoutManager(this,RecyclerView.VERTICAL,false));
    recyclerViewAdapterSearch = new RecyclerViewAdapterSearch(this);
    recyclerViewSearch.setAdapter(recyclerViewAdapterSearch);
    Log.d("SearchAllSize",String.valueOf(Constant.searchItem.size())+" | "+
            String.valueOf(Constant.filteredMediaList.size())+" | "+
            String.valueOf(mediaList.size()));
    
     //working fine till now
    editTextSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
        @Override
        public void afterTextChanged(Editable editable) {
            String text = editable.toString();
            filter(text);
        }
    });