我有一个RecyclerView
,其中包含Lift
类型的对象列表。
班级Lift
有一个名为date2PrettyString
的函数,该函数以DateTime
格式返回dd MMM. yyyy
。
我想显示所有Lift
个对象,但每次显示带有其他日期的电梯时都会创建标题。
例如,假设我有5个Lift
类型的对象,其输出为date2PrettyString
我想要的结果列表如下:
进入适配器的列表总是按日期降序排序(就像示例中一样)。
我为显示日期的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
函数中将它与什么进行比较,因为不知道用户是向上还是向下滚动。