RecyclerView部分回收了一些视图

时间:2018-05-12 03:33:36

标签: android android-recyclerview rx-java2 recycler-adapter

我有一个应用程序,根据比赛的日期显示一些足球比赛的比赛日。我正在使用微调器来重新创建我的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 :(得分:0)

感谢@jantursky和网上的一些深入挖掘,我遇到了这一系列的articles并设法确定我的 RecyclerView 在没有{{1}的情况下重新创建所有视图因为在回收站中,废料清单是RecyclerView在搜索ViewHolder时所看到的第一个地方。

所以要解决问题:

  • 创建了一个用于检索列表 IDS 的接口。
  • 适配器中创建 refreshAdapter()方法。
  • 使用 setHasStableIds( true
  • 在`mSpinner.setOnItemSelectedListener()之外初始化并实例化适配器
  • setStableIds(true)电话 refreshAdapter()