Java 滚动后如何阻止我的recyclerView视图类型更改?
在我的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
@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