Android ListAdapter.getItemCount() 总是返回 0

3

我尝试在RecyclerView为空时显示一个TextView。 但是,即使RecyclerView显示项目,ListAdaptergetItemCount()始终返回0。

Fragment.java

public class ProjectsFragment extends Fragment {

    private RepoViewModel repoViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        FloatingActionButton floatingActionButton = ((MainActivity) requireActivity()).getFloatingActionButton();
        floatingActionButton.setVisibility(View.VISIBLE);

        return inflater.inflate(R.layout.fragment_projects, container, false);
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        TextView textview_no_project = view.findViewById(R.id.textview_no_project);

        RecyclerView recyclerView = view.findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity().getApplicationContext()));
        final RepoListAdapter adapter = new RepoListAdapter(new RepoListAdapter.RepoDiff());

        if (adapter.getItemCount() == 0) {
            recyclerView.setVisibility(View.INVISIBLE);
            textview_no_project.setVisibility(View.VISIBLE);
        }
        else {
            recyclerView.setVisibility(View.VISIBLE);
            textview_no_project.setVisibility(View.INVISIBLE);
        }
        recyclerView.setAdapter(adapter);
        repoViewModel = new ViewModelProvider(requireActivity()).get(RepoViewModel.class);
        repoViewModel.getAllRepos().observe(getViewLifecycleOwner(), adapter::submitList);
    }
}

RepoListAdapter.java

public class RepoListAdapter extends ListAdapter<Repo, RepoViewHolder> {

    public RepoListAdapter(@NonNull DiffUtil.ItemCallback<Repo> diffCallback) {
        super(diffCallback);
    }

    @NonNull
    @Override
    public RepoViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        return RepoViewHolder.create(viewGroup);
    }

    @Override
    public void onBindViewHolder(RepoViewHolder holder, int position) {
        Repo current = getItem(position);
        holder.bind(current.getName());
    }

    public static class RepoDiff extends DiffUtil.ItemCallback<Repo> {

        @Override
        public boolean areItemsTheSame(@NonNull Repo oldItem, @NonNull Repo newItem) {
            return oldItem == newItem;
        }

        @Override
        public boolean areContentsTheSame(@NonNull Repo oldItem, @NonNull Repo newItem) {
            return oldItem.getName().equals(newItem.getName());
        }
    }
}

非常感谢任何帮助。


你的代码片段在适配器提交数据之前尝试调用 getItemCounts。因此,在启动时它将始终为零。 - Kyle
1个回答

3

仅当adapter::submitList调用之后(即LiveData观察器调用后),数据才会被设置。 因此,您需要在此之后进行更改。 有几种方法可以做到这一点。 其中一种方式如下,您需要将适配器创建为全局变量,或者只需从RecyclerView获取它。

public void onLoaded(List<Repo> list){
    if (list.size() == 0) {
        recyclerView.setVisibility(View.INVISIBLE);
        textview_no_project.setVisibility(View.VISIBLE);
    }
    else {
        recyclerView.setVisibility(View.VISIBLE);
        textview_no_project.setVisibility(View.INVISIBLE);
        adapter.submitList(list);
    }
}

onLoaded 设置为观察者Lambda函数。

repoViewModel.getAllRepos().observe(getViewLifecycleOwner(), this::onLoaded);

您还可以使用提交列表变体 submitList(@Nullable List<String> list, @Nullable Runnable commitCallback),它将为您提供一个回调,并且您可以在Runnable中执行相同的操作。这在本例中几乎是相同的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接