Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView部分回收一些视图_Android_Rx Java2_Android Recyclerview - Fatal编程技术网

Android RecyclerView部分回收一些视图

Android RecyclerView部分回收一些视图,android,rx-java2,android-recyclerview,Android,Rx Java2,Android Recyclerview,我有一个应用程序,根据比赛日期显示一些足球比赛的比赛日。我正在使用微调器根据用户选择的dummyData()重新创建我的RecyclerView的适配器。但有时,在首次初始化或回收RecyclerView时,它会显示my.xml的格式 通过在适配器上添加自定义动画,我成功地降低了视觉故障的程度,但有时还是会发生这种情况,比如在我更改比赛日的10%的时间里 格式化_home.xml 这是我为设计此格式而创建的占位符 Gif显示问题: HomeFragment.java @Override pu

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

通过在适配器上添加自定义动画,我成功地降低了视觉故障的程度,但有时还是会发生这种情况,比如在我更改比赛日的10%的时间里

格式化_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;
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u home,container,false);
mRecyclerView=view.findviewbyd(R.id.home\u recycler\u视图);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false));
mSpinner=view.findviewbyd(R.id.spinner\u home);
List matchDay=new ArrayList();
对于(int i=0;i<20;i++){
添加(“匹配日”+(i+1));
}
HomePinnerAdapter dataAdapter=新的HomePinnerAdapter(getContext(),R.layout.format\u home\u微调器,matchDay);
mSpinner.setAdapter(dataAdapter);
mSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
mHomeItems=新的ArrayList();
mDisposable.add(Observable.fromArray(mHomeItems))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(家庭项目->{
Map hashMap=toMap(dummyData());
//地图键
for(字符串日期:hashMap.keySet()){
页眉=新页眉(日期);
添加(标题);
for(匹配日匹配日:hashMap.get(日期)){
MatchItem MatchItem=新的MatchItem(matchday);
添加(匹配项);
}
}
mAdapter=新的HomeAdapter(homeItems,getActivity(),mTeamViewModel);
mRecyclerView.setAdapter(mAdapter);
}));
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
返回视图;
}
//映射值列表
私人地图toMap(列出比赛日){
Map Map=newtreemap();
适用于(比赛日:比赛日){
列表值=map.get(matchday.getDate());
如果(值==null){
值=新的ArrayList();
map.put(matchday.getDate(),value);
}
增值(比赛日);
}
返回图;
}
公共列表dummyData(){
mMatchdayList=newarraylist();
随机=新随机();
对于(int i=0;i<20;i++){
mMatchdayList.add(新的匹配日((i+1),buildRandomDateInCurrentMonth(),1,random.nextInt(36),0,0,random.nextInt(36));
}
返回mMatchdayList;
}

如果您有任何反馈或需要任何其他活动,请告诉我!TY

多亏了@jantursky和网络上的一些深入挖掘,我才发现我的RecyclerView在没有
SetTableId(true)
的情况下重新创建了所有视图,因为在recyclers中,废品清单是RecyclerView在搜索视图持有者时首先查看的地方

所以要解决问题:

  • 创建了检索列表ID的界面
  • 适配器中创建了refreshAdapter()方法
  • 使用setHassTableId(true)在`mSpinner.setOnItemSelectedListener()外部初始化并实例化适配器
  • mSpinner.setOnItemSelectedListener中调用refreshAdapter()

在单击
onClick
之前创建
RecyclerView
适配器,然后在
onItemSelected()中调用
notifyDatasetChanged()
,仍然发生:|@Ispam取决于您是否在HomeAdapter类中启用了
setStableIds
。如果是,请检查方法
getItemId
(我想),每行的每个唯一id的逻辑是什么。