我需要在哪里选择要在RecylerView中显示的图片?

时间:2019-07-15 15:53:03

标签: android android-recyclerview

问题可能不像我希望的那么容易理解。

我创建了一个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个白色元素,没有任何内容。我是用错误的方法询问日期还是在哪里出错了?

2 个答案:

答案 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,则视图不会显示。

我希望这会有所帮助。快活的编码!