RecyclerView多个标题

时间:2018-06-16 21:53:07

标签: android android-recyclerview recycler-adapter

我有一个RecyclerView,其中包含Lift类型的对象列表。

班级Lift有一个名为date2PrettyString的函数,该函数以DateTime格式返回dd MMM. yyyy

我想显示所有Lift个对象,但每次显示带有其他日期的电梯时都会创建标题。

例如,假设我有5个Lift类型的对象,其输出为date2PrettyString

  • ob1:03年2018年
  • ob2:03年2018年
  • ob3:2018年12月01日
  • ob4:058年8月5日
  • ob5:2018年8月5日

我想要的结果列表如下:

  • 2018年12月3日
  • ob1.getName();
  • ob2.getName();
  • 2018年12月1日
  • ob3.getName();
  • 2018年8月5日
  • ob4.getName();
  • ob5.getName();

进入适配器的列表总是按日期降序排序(就像示例中一样)。

我为显示日期的TextView创建了一个布局,为显示名称的TextView创建了另一个布局。

我的一些适配器代码如下

    public ExerciseLiftsRecyclerAdapter(RealmResults<Lift> itemList, Context context, View.OnClickListener listener, Fragment fragment) {
        this.mItemsList = itemList;
        this.mFragment = fragment;
        this.mContext = context;
        this.mListener = listener;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, final int viewType) {
        RecyclerView.ViewHolder viewHolder;
        if (viewType == TYPE_ITEM) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.adapter_lift_text, parent, false);
            view.setOnClickListener(mListener);
            viewHolder = new LiftTextHolder(view);
        } else {
            View view = LayoutInflater.from(mContext).inflate(R.layout.adapter_lift_date, parent, false);
            view.setOnClickListener(mListener);
            viewHolder = new DateTextHolder(view);
        }
        return viewHolder;
    }

    @Override
    public int getItemViewType(int position) {
        if (isPositionHeader(position))
            return TYPE_HEADER;
        return TYPE_ITEM;
    }

    private boolean isPositionHeader(int position) {
        if (position == 0) {
            return true;
        }
        if (position == 1)
            return false;

        // not sure what to put here  for positions > 1
    }


    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        this.mCurrentLift = mItemsList.get(position - (int) mItemsList.stream().limit(position).map(Lift::date2PrettyString).count()); // not sure if that's right

        if (holder instanceof LiftTextHolder) {
            LiftTextHolder itemViewHolder = (LiftTextHolder) holder;
            //do stuff
        } else if (holder instanceof DateTextHolder) {
            DateTextHolder mHolder = (DateTextHolder) holder;
            //do stuff
        }
    }

    private Lift getClickedLift() {
        return mCurrentLift;
    }

    @Override
    public int getItemCount() {
        return mItemsList.size() + (int) mItemsList.stream().map(Lift::date2PrettyString).distinct().count();
    }

我很遗憾如何在getItemViewType函数中返回适当的值,如果我在onBindViewHolder函数中做了什么就好了。

想到的最佳解决方案是每个位置使用流计算多少个不同的日期(类似于我在OnBindViewHolder内所做的。但我不确定这是不是一个好主意,因为我不喜欢我不知道在getItemViewType函数中将它与什么进行比较,因为不知道用户是向上还是向下滚动。

0 个答案:

没有答案