Сброс RecylerView без очистки адаптера - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь управлять RyclerView в моем фрагменте. Когда я открываю приложение, фрагмент загружается и также создается список элементов (это выполняется методом loadMov ie () ). Теперь я добавил кнопку поиска и хотел бы перезагрузить метод loadMov ie (), чтобы обновить sh список элементов. Моя проблема в том, что даже если список меняется, когда я нажимаю на элемент, он открывает мне два новых действия: одно из объекта, на котором я щелкнул, и одно из элемента, который был в той же позиции, что и предыдущий вызывая метод. Как я могу удалить все старые элементы RecyclerView без изменения адаптера? Это код:

 public class PopularFragment extends Fragment {

    private EditText mSearchField;
    private ImageButton mSearchBtn;

    @BindView(R.id.rc_view)
    RecyclerView recyclerView;

    public PopularFragment() {
    }

    public static PopularFragment newInstance(String param1, String param2) {
        PopularFragment fragment = new PopularFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        onPause();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.popular_fragment, container, false);
        recyclerView = view.findViewById(R.id.popular_rc_view);

        mSearchField = (EditText) view.findViewById(R.id.search_field);
        mSearchBtn = (ImageButton) view.findViewById(R.id.search_btn);

        mSearchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loadMovie();
            }
        });

        loadMovie();
        return view;
    }


    @Override
    public void onPause() {
        super.onPause();
    }

    private void loadMovie() {
        ApiService apiService = ApiBuilder.getClient(getContext()).create(ApiService.class);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL, false));
        Call<MovieResponse> call = apiService.getPopular(Values.CATEGORY[1], BuildConfig.API_KEY,Values.LANGUAGE,Values.PAGE[0]);
        call.enqueue(new Callback<MovieResponse>() {
            @Override
            public void onResponse(Call<MovieResponse>call, Response<MovieResponse> response) {
                final List<MovieModel> movies = response.body().getResults();
                recyclerView.setAdapter(new PopularAdapter(movies, R.layout.content_main, getContext()));
                recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                    GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
                        public boolean onSingleTapUp(MotionEvent e){
                            return true;
                        }
                    });

                    @Override
                    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
                        View child = rv.findChildViewUnder(e.getX(), e.getY());
                        if (child != null && gestureDetector.onTouchEvent(e)){
                            int position = rv.getChildAdapterPosition(child);
                            //loadActivity
                        }
                        return false;
                    }

                    @Override
                    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

                    }

                    @Override
                    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

                    }
                });
            }

            @Override
            public void onFailure(Call<MovieResponse>call, Throwable t) {
            }
        });
    }
}

1 Ответ

1 голос
/ 10 марта 2020

Вы пытались определить класс адаптера глобально?

Попробуйте выполнить следующие шаги: -

  1. Определите класс адаптера глобально и пропустите пустой список фильмов.
  2. Добавьте функцию в адаптер, которая принимает список фильмов, которые вы можете вызвать, вместо повторного определения адаптера.
  3. Call (переменная класса адаптера) .notifyDataSetChanged (); каждый раз после вызова новой функции, которая заполняет ваши данные, она будет обновлять sh ваш список данных.
...