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