如何解决无法清除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'中再次初始化适配器的方法只是对其进行更新,您的助手将起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。