繁体   English   中英

RecyclerView部分回收了一些视图

[英]RecyclerView partially recycling some views

我有一个应用程序,根据比赛 日期显示一些足球比赛的比赛 我正在使用微调器根据用户选择的一些dummyData() 重新创建 RecyclerView的适配器。 但是有时在RecyclerView首次初始化或回收时,它实际上显示了.xml的格式。

我设法通过在Adapter上添加自定义动画来减少视觉故障的程度,但有时还是会发生这种情况,就像我更改Matchday的时间的10%一样。

format_home.xml

这是我为设计此格式而创建的占位符。

format_home.xml

Gif显示问题:

问题

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

感谢@jantursky和对Web的深入研究,我找到了本系列文章,并设法确定了我的RecyclerView在没有setStableIds(true)的情况下正在重新创建所有视图,因为在回收站中,废品清单是RecyclerView出现的第一处搜索ViewHolder时。

所以要解决问题:

  • 创建一个接口以检索列表IDS
  • Adapter中创建了refreshAdapter()方法。
  • 使用setHasStableIds( true在`mSpinner.setOnItemSelectedListener()外部初始化并实例化适配器
  • mSpinner.setOnItemSelectedListener内部,调用refreshAdapter()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM