Java 滚动后如何阻止我的recyclerView视图类型更改?

Java 滚动后如何阻止我的recyclerView视图类型更改?,java,android,android-recyclerview,android-view,Java,Android,Android Recyclerview,Android View,在我的RecyclerView适配器类中,我有两种视图类型来显示查询结果: @Query("SELECT l.log_id, l.junction_id ,l.date, l.workout_id, l.total_weight_lifted, l.reps, l.set_number FROM log_entries_table AS l LEFT JOIN exercise_workout_junction_table AS ej

在我的RecyclerView适配器类中,我有两种视图类型来显示查询结果:

 @Query("SELECT l.log_id, l.junction_id ,l.date, l.workout_id, l.total_weight_lifted,
         l.reps, l.set_number FROM log_entries_table 
         AS l LEFT JOIN exercise_workout_junction_table AS ej 
         ON ej.exercise_workout_id = l.junction_id WHERE ej.exercise_id = :exerciseID 
         ORDER BY substr(l.date, -4) DESC, substr(l.date, -7) DESC, (l.date) DESC")

    LiveData<List<Log_Entries>> getAllExerciseHistoryLogs(int exerciseID);
@Query(“选择l.log\u id、l.junction\u id、l.date、l.workout\u id、l.total\u weight\u lifted、,
l、 代表,l.从日志条目表设置编号
如左所示,以ej的身份加入运动\锻炼\连接\表格
在ej.exercise\u workout\u id=l.junction\u id上,其中ej.exercise\u id=:exerciseID
按次顺序(l.date,-4)描述,次顺序(l.date,-7)描述,(l.date)描述“
LiveData getAllExerciseHistoryLogs(int exerciseID);
第一种视图类型用于显示日期唯一的所有日志条目:

第二种视图类型是显示与上述日期相同的其余日志条目:

我当前的代码工作正常,但是每次我向下滚动并且recyclerView更新时,所有具有“唯一”日期的日志条目(应该使用第一个视图类型)都会更改为显示第二个视图类型

如何阻止我的recyclerView视图类型更改

->

回收视图适配器


public class ExerciseHistoryAdapter2 extends RecyclerView.Adapter {

    private OnItemClickListener listener;
    private List<Log_Entries> allLogEntries = new ArrayList<>();
    private List<String> uniqueDates = new ArrayList<>();
    String logEntryDate;

    public void setExercises(List<Log_Entries> allLogEntries) {
        this.allLogEntries = allLogEntries;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view;

        if (viewType == 0) {
            view = layoutInflater.inflate(R.layout.exercise_history_item, parent, false);
            return new ViewHolderOne(view);
        }

        view = layoutInflater.inflate(R.layout.exercise_history_item_two, parent, false);
        return new ViewHolderTwo(view);
    }

    @Override
    public long getItemId(int position) {

        return allLogEntries.get(position).getLog_id();
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        logEntryDate = allLogEntries.get(position).getDate();

        if (uniqueDates.contains(logEntryDate)) {
            // bindViewHolder2
            ViewHolderTwo viewHolderTwo = (ViewHolderTwo) holder;
            viewHolderTwo.textViewWeight.setText(String.valueOf(allLogEntries.get(position).getTotal_weight_lifted()));
            viewHolderTwo.textViewReps.setText(String.valueOf(allLogEntries.get(position).getReps()));

        } else {
            uniqueDates.add(logEntryDate);
            //bind viewholder1
            ViewHolderOne viewHolderOne = (ViewHolderOne) holder;
            viewHolderOne.textViewDate.setText(allLogEntries.get(position).getDate());
            viewHolderOne.textViewWeight.setText(String.valueOf(allLogEntries.get(position).getTotal_weight_lifted()));
            viewHolderOne.textViewReps.setText(String.valueOf(allLogEntries.get(position).getReps()));
        }
    }

    @Override
    public int getItemCount() {
        return allLogEntries.size();
    }

 @Override
    public int getItemViewType(int position) {

        logEntryDate = allLogEntries.get(position).getDate();

        if (uniqueDates.contains(logEntryDate)) {
            return 1;
        }
        return 0;
    }

    class ViewHolderOne extends RecyclerView.ViewHolder {
        private TextView textViewDate;
        private TextView textViewWeight;
        private TextView textViewReps;

        public ViewHolderOne(@NonNull View itemView) {
            super(itemView);

            textViewDate = itemView.findViewById(R.id.textView_dateH);
            textViewWeight = itemView.findViewById(R.id.textView_weightH);
            textViewReps = itemView.findViewById(R.id.textView_repss);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(allLogEntries.get(position));
                    }
                }
            });
        }
    }

    class ViewHolderTwo extends RecyclerView.ViewHolder {
        private TextView textViewWeight;
        private TextView textViewReps;

        public ViewHolderTwo(@NonNull View itemView) {
            super(itemView);
            textViewWeight = itemView.findViewById(R.id.textView_weightH2);
            textViewReps = itemView.findViewById(R.id.textView_repss2);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(allLogEntries.get(position));
                    }
                }
            });

        }
    }

    public interface OnItemClickListener {
        void onItemClick(Log_Entries log_entries);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
}

公共类ExerciseHistoryAdapter2扩展了RecyclerView.Adapter{
私人监听;
private List allLogEntries=new ArrayList();
private List uniqueDates=new ArrayList();
字符串logEntryDate;
公开作废设置练习(列出所有日志条目){
this.allLogEntries=allLogEntries;
notifyDataSetChanged();
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
LayoutInflater LayoutInflater=LayoutInflater.from(parent.getContext());
视图;
如果(viewType==0){
视图=布局更平坦。充气(R.layout.exercise\u history\u项,父项,false);
返回新的ViewHolderOne(视图);
}
视图=布局更平坦。充气(R.layout.exercise\u history\u item\u two,parent,false);
返回新的ViewHolderTwo(视图);
}
@凌驾
公共长getItemId(int位置){
返回所有logentries.get(position.getLog_id();
}
@凌驾
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder,int位置){
logEntryDate=allLogEntries.get(position.getDate();
if(uniqueDates.contains(logEntryDate)){
//bindViewHolder2
ViewHolderTwo ViewHolderTwo=(ViewHolderTwo)支架;
viewHolderTwo.textViewWeight.setText(String.valueOf(allLogEntries.get(position.getTotal_weight_lifted());
viewHolderTwo.textViewReps.setText(String.valueOf(allLogEntries.get(position.getReps()));
}否则{
uniqueDates.add(logEntryDate);
//绑定视图持有者1
ViewHolderOne ViewHolderOne=(ViewHolderOne)支架;
viewHolderOne.textViewDate.setText(allLogEntries.get(position.getDate());
viewHolderOne.textViewWeight.setText(String.valueOf(allLogEntries.get(position.getTotal_weight_lifted());
viewHolderOne.textViewReps.setText(String.valueOf(allLogEntries.get(position.getReps()));
}
}
@凌驾
public int getItemCount(){
返回allLogEntries.size();
}
@凌驾
public int getItemViewType(int位置){
logEntryDate=allLogEntries.get(position.getDate();
if(uniqueDates.contains(logEntryDate)){
返回1;
}
返回0;
}
类ViewHolderOne扩展了RecyclerView.ViewHolder{
私有文本视图文本视图日期;
私有文本视图文本视图权重;
私有文本视图文本视图代表;
public ViewHolderOne(@NonNull View itemView){
超级(项目视图);
textViewDate=itemView.findViewById(R.id.textView\u dateH);
textViewWeight=itemView.findViewById(R.id.textView\u weightH);
textViewReps=itemView.findViewById(R.id.textView\u repss);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
if(侦听器!=null&&position!=RecyclerView.NO\u位置){
onItemClick(allLogEntries.get(position));
}
}
});
}
}
类ViewHolder两个扩展RecyclerView.ViewHolder{
私有文本视图文本视图权重;
私有文本视图文本视图代表;
public ViewHolderTwo(@NonNull View itemView){
超级(项目视图);
textViewWeight=itemView.findViewById(R.id.textView\u weight2);
textViewReps=itemView.findViewById(R.id.textView\u repss2);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
if(侦听器!=null&&position!=RecyclerView.NO\u位置){
onItemClick(allLogEntries.get(position));
}
}
});
}
}
公共接口侦听器{
void onItemClick(日志项日志项);
}
公共void setOnItemClickListener(OnItemClickListener侦听器){
this.listener=listener;
}
}

我想设置
holder.setIsRecyclable(false)
将解决此问题,因为recycler视图将不再回收项目。。。但对于长列表来说,这不是一个好的解决方案

编辑: 我在onBindViewHolder()中查看了您的代码。。。 我认为问题来自
uniqueDates.add(logEntryDate)
并多次调用
onBindViewHolder
方法

以下是“回收者”视图的处理方式:

  • 列表中的第一项将是唯一的,因为
    uniqueDates