无法清除 ArrayAdapter

Cannot clear an ArrayAdapter

我有一个过滤器面板,我使用回调从它和我的 Firebase 实时数据库中获取数据。我有一个 if/else 块。如果 answer.size() == 0 为真(答案是过滤器值的列表),我用一个列表填充我的适配器。如果为假,我想清除一个适配器并有一个空的 ListView。 这是我的代码:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        verifyStoragePermissions(getActivity());
        ArrayList<PlayerRating> finalRatingList = new ArrayList<PlayerRating>();
        View view = inflater.inflate(R.layout.rating_fragment, container, false);
        button = view.findViewById(R.id.convertButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                alertSingleChoiceItems(); ;

            }});
        Database base = new Database();
        base.readTournaments(new Database.TournamentsCallback() { //reading data from Firebase using callback
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onCallback(ArrayList<TournamentParameters> tournamentsList,
                                   ArrayList<String> tournamentsNames, ArrayList<String> answer) {
                ArrayList<PlayerRating>ratingList = new ArrayList<PlayerRating>();
                ArrayList<TournamentParameters> editableTournamentsList = new ArrayList<TournamentParameters>(tournamentsList);
                PlayerRatingAdapter adapter = new PlayerRatingAdapter(getActivity(), R.layout.rating_adapter_item, 
                        new ArrayList<PlayerRating>());
                ListView listview = (ListView) view.findViewById(R.id.ratingListView);
                if (answer.size() == 0) { // answer.size() is a size of an ArrayList with filters' values
                    ratingList.clear();
                    finalRatingList.clear();
                    HashMap<String, Integer> rating = new HashMap<String, Integer>();
                    //tournamentsList filling
                    ...

                    //ratingList filling
                    ...
                    
                    //ratingList sorting
                    ...
                    adapter = new PlayerRatingAdapter(getActivity(), R.layout.rating_adapter_item, ratingList);
                    adapter.notifyDataSetChanged();
                    ViewGroup header = (ViewGroup) inflater.inflate(R.layout.rating_listview_header,
                            listview, false);
                    listview.addHeaderView(header);
                    listview.setAdapter(adapter);
                    adapter.notifyDataSetChanged();

                }
                else {
                    ratingList.clear();
                    finalRatingList.clear();
                    adapter.clear();
                    adapter.notifyDataSetChanged();
                    Log.d("okey", "cleared!");
                    }
                Button filtersTV = getActivity().findViewById(R.id.filtersTV);
                filtersTV.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        showFragment();

                    }
                });    
                }
        });
        return view;
}

showFragment 方法:

private void showFragment() {
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        if (!fragment.isAdded()) {

            transaction.add(R.id.frame, fragment, "filter");
        }
        transaction.addToBackStack(null);
        transaction.commit();
    }

此外,当我设置过滤器方法时 dismissFragment() 起作用(它负责从我的过滤器面板片段返回到我的带有 ListView 的片段):

public void dismissFragment() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!fragment.isAdded()) {
            transaction.add(R.id.frame, fragment, "filter");
        }
        transaction.replace(R.id.frame, new RatingFragment());
        transaction.addToBackStack(null);
        transaction.commit();
        //FragmentManager fm = getSupportFragmentManager();
        //fm.popBackStackImmediate();
    }

问题是我的适配器没有被清除。当代码转到 else 块和

ratingList.clear();
finalRatingList.clear();
adapter.clear();
adapter.notifyDataSetChanged();
Log.d("okey", "cleared!");

有效(我的 LogCat 中甚至有预期的消息),没有任何变化 - 我的 ListView 保持不变,没有任何内容被清除。 我应该在代码中更改什么?

您的代码中有两个不同的适配器实例。一个在 if/else 外面,一个在 'if block' 里面。 这就是为什么当您在 'else block' 中清除它时它不是同一个适配器。什么也没发生。

Instrad 在 'if block' 中再次初始化适配器只需更新它,您的 cide 就可以工作了。