java - 过滤器在 Android 上显示错误的项目
问题描述
我正在为 Android 开发电影应用程序。我有个问题。我试图在互联网上看到它,因为有一些解决方案但没有任何效果。我的问题是这样的:我尝试按字母“W”过滤列表,我的数组充满了 2 个项目。但是在我的应用程序中,它显示了错误的项目之一。
我的代码:
MovieListMoreFragment.class
public class MovieListMoreFragment extends Fragment implements OnMovieListener{
//ViewBinding
private MovieListMoreFragmentBinding movieListMoreFragmentBinding;
//ViewModel
private MovieListMoreViewModel movieListMoreViewModel;
//Adapter
private GridViewAdapter gridViewAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
movieListMoreFragmentBinding = MovieListMoreFragmentBinding.inflate(inflater,container,false);
movieListMoreViewModel = new ViewModelProvider(this).get(MovieListMoreViewModel.class);
//configure gridView
configureGridView();
//Calling the observer
observerAllMoviesChange();
//configure searchView
configureSearchView();
movieListMoreViewModel.getMoviesPagination(28);
return movieListMoreFragmentBinding.getRoot();
}
//observer
private void observerAllMoviesChange() {
movieListMoreViewModel.getAllMovies().observe(requireActivity(), new Observer<List<MovieModel>>() {
@Override
public void onChanged(List<MovieModel> movieModels) {
if(movieModels!=null) {
gridViewAdapter.movies = movieModels;
if(GridViewAdapter.allMovies.size() >0)
GridViewAdapter.allMovies.clear();
GridViewAdapter.allMovies.addAll(gridViewAdapter.movies);
gridViewAdapter.notifyDataSetChanged();
}
}
});
}
//configure GridView
private void configureGridView() {
gridViewAdapter = new GridViewAdapter(this);
movieListMoreFragmentBinding.gridview.setAdapter(gridViewAdapter);
movieListMoreFragmentBinding.gridview.setOnScrollListener(this);
}
//configure searchView
private void configureSearchView() {
//search movie
movieListMoreFragmentBinding.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
gridViewAdapter.getFilter().filter(newText);
return false;
}
});
}
//when user clicks on the movie
@Override
public void onMovieClick(MovieModel movie) {
Bundle bundle = new Bundle();
bundle.putParcelable("movie", movie);
Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(R.id.movieDetailsFragment,bundle);
}
}
GridViewAdapter.class
public class GridViewAdapter extends BaseAdapter implements Filterable {
public List<MovieModel> movies;
private OnMovieListener onMovieListener;
public static ArrayList<MovieModel> allMovies = new ArrayList<>();
private static final int DISPLAY_MORELIST = 1;
private static final int DISPLAY_WATCHLIST = 2;
private static final int DISPLAY_SIMILARLIST = 3;
public GridViewAdapter(OnMovieListener onMovieListener){
this.onMovieListener = onMovieListener;
}
@Override
public int getCount() {
return (movies != null ? movies.size() : 0);
}
@Override
public Object getItem(int position) {
return movies.get(position);
}
@Override
public long getItemId(int position){return position;}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
{
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
MovieListItemBinding movieListItemBinding = MovieListItemBinding.inflate(layoutInflater);
convertView = movieListItemBinding.getRoot();
Glide.with(movieListItemBinding.image).load("https://image.tmdb.org/t/p/w500/" + movies.get(position).getPoster_path())
.placeholder(R.drawable.movie).into(movieListItemBinding.image);
movieListItemBinding.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int itemViewType = getItemViewType(position);
if(itemViewType == DISPLAY_MORELIST) {
if (movies.size() == allMovies.size()) //whether the user clicked on the movie while filtering... when filtering the movies will be updated
onMovieListener.onMovieClick(movies.get(position));
else {
onMovieListener.onMovieClick(allMovies.get(position));
}
}
else
onMovieListener.onMovieClick(movies.get(position));
}
});
}
return convertView;
}
@Override
public int getItemViewType(int position) {
if(Variables.WATCHLIST)
return DISPLAY_WATCHLIST;
if(Variables.DISPLAY_SIMILARLIST)
return DISPLAY_SIMILARLIST;
else
return DISPLAY_MORELIST;
}
@Override
public Filter getFilter() {
return filter;
}
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence newText) {
List<MovieModel> filteredMovies = new ArrayList<>();
if (newText == null || newText.length() == 0) {
filteredMovies.addAll(GridViewAdapter.allMovies);
} else {
for (MovieModel m : GridViewAdapter.allMovies) {
if (m.getOriginal_title().toLowerCase().contains(newText.toString().toLowerCase())) {
filteredMovies.add(m);
}
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = filteredMovies;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
movies.clear();
movies.addAll((Collection<? extends MovieModel>) filterResults.values);
notifyDataSetChanged();
}
};
}
我的问题:
解决方案
设置 Glide 时,首先将其设置为 null,因为视图正在被重用。
推荐阅读
- c# - .NET Core - HttpClient 与 RestSharp
- python - Python - 用大括号分割多行字符串
- mongodb - 如何连接到 mogodb 集群中的主节点
- django - 如何将模型从 CBV 传递到 ModelForm
- java - 如何使用 DOM 解析 java 中的内联/混合内容 xml 元素
- python - Python opencv - 如何计算对象wrt样本的角度
- python - 如何在 Kotlin 中使用链接来解析 JSON,如 python
- babeljs - 如何在 pm2 集群模式下使用 babel 解释器
- mercurial - 是什么导致 hg rebase 留下一个完全空的变更集?
- php - PHP 为控制台和网页显示不同的时区