Android ListAdapter.getItemCount() returns 总是 0
Android ListAdapter.getItemCount() returns always 0
如果 RecyclerView
为空,我会尝试显示 TextView
。
但是 ListAdapter
的 getItemCount()
总是 returns 0,即使 RecyclerView
显示项目。
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());
}
}
}
如有任何帮助,我们将不胜感激。
数据只会在 adapter::submitList
调用后设置,即在实时数据观察器调用后。所以你需要在它之后进行更改。有几种方法可以做到这一点。下面是一种方法,您需要将适配器创建为全局适配器或从 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
中做同样的事情。在这种情况下,这几乎是一回事。
如果 RecyclerView
为空,我会尝试显示 TextView
。
但是 ListAdapter
的 getItemCount()
总是 returns 0,即使 RecyclerView
显示项目。
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());
}
}
}
如有任何帮助,我们将不胜感激。
数据只会在 adapter::submitList
调用后设置,即在实时数据观察器调用后。所以你需要在它之后进行更改。有几种方法可以做到这一点。下面是一种方法,您需要将适配器创建为全局适配器或从 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
中做同样的事情。在这种情况下,这几乎是一回事。