首页 > 解决方案 > 过滤器在 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();
    }
};

}

我的问题:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

标签: javaandroidgridviewfilter

解决方案


设置 Glide 时,首先将其设置为 null,因为视图正在被重用。


推荐阅读