Java 无法清除ArrayAdapter
我有一个过滤器面板,通过回调从它和Firebase实时数据库中获取数据。我有一个if/else块。如果Java 无法清除ArrayAdapter,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,我有一个过滤器面板,通过回调从它和Firebase实时数据库中获取数据。我有一个if/else块。如果answer.size()==0为真(答案是过滤器值的列表),我将用列表填充适配器。如果为false,我希望清除一个适配器并获得一个空的ListView。 这是我的密码: public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
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(), 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;
}
另外,当我设置filters方法dismissFragment()
工作时(它负责使用ListView从我的过滤器面板片段返回到我的片段):
问题是我的适配器没有被清除。当代码转到else
块并
ratingList.clear();
finalRatingList.clear();
adapter.clear();
adapter.notifyDataSetChanged();
Log.d("okey", "cleared!");
工作正常(我的日志中甚至有一条预期的消息),没有任何更改-我的ListView保持不变,没有任何内容被清除。
我应该在代码中更改什么?您的代码中有两个不同的适配器实例。一个在if/else外部,一个在“if块”中。 这就是为什么在“else block”中清除它时,它不是同一个适配器。什么也没发生 在“if block”中再次初始化适配器的指令只需更新它,您的cide就会工作
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();
}
ratingList.clear();
finalRatingList.clear();
adapter.clear();
adapter.notifyDataSetChanged();
Log.d("okey", "cleared!");