【问题标题】:The filter shows the wrong items on Android过滤器在 Android 上显示错误的项目
【发布时间】:2021-02-24 13:50:46
【问题描述】:

我正在为 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();
    }
};

}

我的问题:

【问题讨论】:

    标签: java android gridview filter


    【解决方案1】:

    我在我的项目中遇到了类似的问题(更新适配器内容) Binding As documentation 视图中的问题您可以查看活动和片段中的绑定没有在适配器中使用的示例,我知道您仍然可以使用它并且会显示正确的内容 但是你在更新它的内容时会遇到一个问题它只会更新最后一个项目,尝试一个不同的词你会注意到最后一个项目是唯一正确显示的 我不知道确切的原因我猜当给每张卡片充气时,视图绑定会改变它的引用直到最后一个项目并保持它的引用 解决方案 适配器类中不要使用视图绑定,使用findViewById();

    【讨论】:

    • 嗨。我测试过。问题出在 ViewBinding 中。非常感谢
    • 更改 MovieListItemBinding movieListItemBinding = MovieListItemBinding.inflate(layoutInflater); ` 到 MovieListItemBinding movieListItemBinding = MovieListItemBinding.bind(convertView); 请告诉我是否可以更新答案
    • 嗨。它没有用。但是使用 findById 效果很好
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多