无法清除ArrayAdapter

问题描述

我有一个筛选器面板,并使用回调从该面板和Firebase实时数据库获取数据。我有一个if / else块。如果answer.size() == 0为真(答案是过滤器值的列表),则用列表填充适配器。如果为false,我想清除适配器并具有一个空的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(),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,"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”中清除它时,它不是同一适配器。没有任何反应。

在'if block'中再次初始化适配器的方法只是对其进行更新,您的助手将起作用。