RecyclerView частично перерабатывает некоторые виды - PullRequest
0 голосов
/ 12 мая 2018

У меня есть приложение, которое отображает Игровой день некоторых футбольных соревнований в зависимости от даты матча.Я использую счетчик для воссоздания адаптера моего RecyclerView в зависимости от выбора пользователя с некоторыми dummyData () .Но иногда, когда RecyclerView впервые инициализируется или перерабатывается, он буквально отображает формат моего .xml .

Мне удалось снизить уровень визуального сбоя, добавив настраиваемую анимацию на Адаптер, но иногда это просто происходит, например, в 10% случаев, когда я меняю День матча .

format_home.xml

Это заполнитель, который я создал для создания этого формата.

format_home.xml

GIF показывает проблему:

problem

HomeFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_home, container, false);
    mRecyclerView = view.findViewById(R.id.home_recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));

    mSpinner = view.findViewById(R.id.spinner_home);


    List<String> matchDay = new ArrayList<>();
    for (int i = 0; i < 20; i++){
        matchDay.add("Matchday " + (i + 1));
    }
    HomeSpinnerAdapter dataAdapter = new HomeSpinnerAdapter(getContext(), R.layout.format_home_spinner, matchDay);
    mSpinner.setAdapter(dataAdapter);

    mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            mHomeItems = new ArrayList<>();
            mDisposable.add(Observable.fromArray(mHomeItems)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(homeItems -> {

                        Map<String, List<Matchday>> hashMap = toMap(dummyData());

                        // Map Key
                        for (String date : hashMap.keySet()) {
                            Header header = new Header(date);
                            homeItems.add(header);
                            for (Matchday matchday : hashMap.get(date)) {
                                MatchItem matchItem = new MatchItem(matchday);
                                homeItems.add(matchItem);
                            }
                        }
                        mAdapter = new HomeAdapter(homeItems, getActivity(), mTeamViewModel);
                        mRecyclerView.setAdapter(mAdapter);
                    }));

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    return view;
}
 // Map Value List<T>
private Map<String,List<Matchday>> toMap(List<Matchday> matchdays) {
    Map<String, List<Matchday>> map = new TreeMap<>();
    for (Matchday matchday : matchdays){
        List<Matchday> value = map.get(matchday.getDate());
        if (value == null) {
            value = new ArrayList<>();
            map.put(matchday.getDate(), value);
        }
        value.add(matchday);
    }
    return map;
}


public List<Matchday> dummyData(){
    mMatchdayList = new ArrayList<>();
    Random random = new Random();
    for (int i = 0; i < 20; i ++){
        mMatchdayList.add(new Matchday((i+1), buildRandomDateInCurrentMonth(), 1, random.nextInt(36), 0, 0, random.nextInt(36)));
    }
    return mMatchdayList;
}

Если выесть какие-либо отзывы или нужна какая-либо другая деятельность, дайте мне знать!TY

1 Ответ

0 голосов
/ 12 мая 2018

Благодаря @jantursky и некоторому углубленному поиску в Интернете я наткнулся на эту серию статей и смог определить, что мой RecyclerView воссоздает все представления в отсутствие setStableIds(true) потому что в утилизаторах списки Scrap - это первое место, где RecyclerView ищет при поиске ViewHolder.

Итак, чтобы решить проблему:

  • Создан интерфейсдля получения списка IDS .
  • Создан метод refreshAdapter () в адаптере .
  • Инициализирован и создан экземпляр Адаптер вне `mSpinner.setOnItemSelectedListener () с setHasStableIds ( true ) .
  • Внутри mSpinner.setOnItemSelectedListener вызова refreshAdapter ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...