问题可能不像我希望的那么容易理解。
我创建了一个RecylerView,其中包含来自ArrayList的c_TakeTimeObjects
类型的对象。这些对象具有有关其自身的特殊信息,例如Date。
因此,在ArrayList中可以有20个这些对象,而我想做的只是显示那些“ Date”值与RecylerView上方TextView中显示的Date值匹配的对象。 / p>
如果TextView显示“ 12.07.2016”,则仅应显示ArrayList中“日期”值设置为“ 12.07.2016”的元素。 如果没有任何具有“日期”值的对象,则列表应为空。
要尝试这一点,我做了以下工作:
@Override
public void onBindViewHolder(@NonNull c_ViewHolder c_viewHolder, int i) {
c_TakeTimeObjects currentItem = c_takeTimeObjects.get(i);
if(currentItem.getiActivityDate().equals("12.06.2016")) {
c_viewHolder.mImageView.setImageResource(currentItem.getiImageResource());
c_viewHolder.mCardview.setLayoutParams(new CardView.LayoutParams((int) (currentItem.getiActivityTime() * fDISPLAYFACTOR), CardView.LayoutParams.WRAP_CONTENT));
c_viewHolder.mCardview.setCardBackgroundColor(currentItem.getiImageColor());
}
}
这是ArrayList的内容:
private void createExampleList() {
StatusImageList = new ArrayList<>();
StatusImageList.add(new c_TakeTimeObjects(c_GlobalValues.iBreakMode,((int) (idefaultRestMinutesEarly)), "12.07.2016",this));
StatusImageList.add(new c_TakeTimeObjects(c_GlobalValues.iWorkingMode, ((int) (idefaultWorkingMinutes)), "12.07.2016",this));
StatusImageList.add(new c_TakeTimeObjects(c_GlobalValues.iBreakMode, ((int) (idefaultBreakMinutes)), "12.07.2016",this));
StatusImageList.add(new c_TakeTimeObjects(c_GlobalValues.iWorkingMode, ((int) (idefaultWorkingMinutes)),"12.07.2016",this));
StatusImageList.add(new c_TakeTimeObjects(c_GlobalValues.iBreakMode, ((int) (idefaultRestMinutesLate)),"12.07.2016",this));
}
请参见“ 12.06.2019”与“ 12.07.2019”之间的区别。
我认为RecylerView现在是空的,但实际上它添加了5个白色元素,没有任何内容。我是用错误的方法询问日期还是在哪里出错了?
答案 0 :(得分:1)
RecyclerView适配器没有过滤数据的概念。那是您需要自己处理的事情。您可以做的一件事是在过滤完列表后将RecyclerView适配器传递给列表。
例如:
List<c_TakeTimeObjects> statusImageList = createExampleList();
Iterator<c_TakeTimeObjects> iter = statusImageLists.iterator();
while (iter.hasNext()) {
if (iter.next().getActivityDate() != /* ... */) {
iter.remove()
}
}
// Set data, constructor, or whatever method you use to set list data
adapter.setData(statusImageList);
适配器非常擅长做一件事:呈现列表中项目的视图。否则不包括过滤或变换。
答案 1 :(得分:0)
是的,此行为是预期的。
一种快速的解决方案是,如果一个元素没有通过if-check,但是有一种风格,则将其隐藏。仅执行itemView.setVisibility(Visibility.GONE)
并不能解决此问题。您需要做的就是将元素的宽度和高度设置为零(从而模仿不可见性)。您可以将onBindViewHolder
实现更改为此:
@Override
public void onBindViewHolder(@NonNull c_ViewHolder c_viewHolder, int i) {
c_TakeTimeObjects currentItem = c_takeTimeObjects.get(i);
if(currentItem.getiActivityDate().equals("12.06.2016")) {
c_viewHolder.mImageView.setImageResource(currentItem.getiImageResource());
c_viewHolder.mCardview.setLayoutParams(new CardView.LayoutParams((int) (currentItem.getiActivityTime() * fDISPLAYFACTOR), CardView.LayoutParams.WRAP_CONTENT));
c_viewHolder.mCardview.setCardBackgroundColor(currentItem.getiImageColor());
}
else {
RecyclerView.LayoutParams param = (RecyclerView.LayoutParams) c_viewHolder.getLayoutParams();
param.height = 0;
param.width = 0;
c_viewHolder.setLayoutParams(param);
}
}
这样,如果未通过if-check,则视图不会显示。
我希望这会有所帮助。快活的编码!