将位置或数组列表传递给静态ViewHolder类时出错

问题描述

由于我的viewholder类是静态的,因此我的arraylist无法获取数据,并且它为null。错误是索引:0,大小:0。我认为这可能是由于静态Reminder_ViewHolder导致的。我需要在holder类中添加位置或数组列表,以便我可以在单击监听器上实现位置postion.so,请问有人可以帮助我吗?

我的适配器类

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

ArrayList<Model> arrayList;
Context context;
int total_types;
private static final String TAG = "RecyclerAdapter";
com.example.caretaker.Database.database database;


public Adapter(ArrayList<Model> arrayList,Context context) {
    this.arrayList = arrayList;
    this.context = context;
    this.total_types = arrayList.size();
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
    View view;
    switch (viewType) {
        case Model.HOME_FRAGMENT:
view = LayoutInflater.from(parent.getContext()).
inflate(R.layout.reminder_sample_for_recycler_view_home_screen,parent,false);
            return new Home_ViewHolder(view);
            return new Home_ViewHolder(view);
        case Model.REMINDER_FRAGMENT:
            view = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.reminder_sample_for_recycler_view,false);
            return new Reminder_ViewHolder(view);
    }

    return null;
}

@Override
public int getItemViewType(int position) {
    switch (arrayList.get(position).ViewType) {
        case 0:
            return Model.HOME_FRAGMENT;
        case 1:
            return Model.REMINDER_FRAGMENT;
    }
    return 0;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
    Model model = arrayList.get(position);
    database = new database(context);

    if (model != null) {
        switch (model.ViewType) {
            case Model.HOME_FRAGMENT:
                //((BannerTypeViewHolder) holder).bannerImg.setBackgroundResource(R.drawable.banner);

                break;
            case Model.REMINDER_FRAGMENT:
                ((Reminder_ViewHolder) holder).title.setText(model.getName());
                ((Reminder_ViewHolder) holder).time.setText(model.getTime());
                ((Reminder_ViewHolder) holder).date.setText(model.getDate());
                ((Reminder_ViewHolder) holder).set_doasge.setText("Medicine Dose is " + 
model.getDose() + " mg");


                // Code for setting up the Medicine Type
                String name = ((Reminder_ViewHolder) holder).title.getText().toString();
                Cursor cursor = database.getAllItems(name);
                ((Reminder_ViewHolder) holder).mediType = -1;

                while (cursor.movetoNext()) {
                    ((Reminder_ViewHolder) holder).mediType = cursor.getInt(5);
                }

                Log.e(TAG,"mediType is " + ((Reminder_ViewHolder) holder).mediType);

                if (((Reminder_ViewHolder) holder).mediType == 1) {
                    ((Reminder_ViewHolder) 
holder).mediType_view.setBackgroundResource(R.drawable.ic_syrup_icon);
                    Log.e(TAG,"Image view is set to syrup");
                } else if (((Reminder_ViewHolder) holder).mediType == 2) {
                    ((Reminder_ViewHolder) 
holder).mediType_view.setBackgroundResource(R.drawable.ic_pill_icon);
                    Log.e(TAG,"Image view is set to pill");
                } else if (((Reminder_ViewHolder) holder).mediType == 3) {
                    ((Reminder_ViewHolder) 
holder).mediType_view.setBackgroundResource(R.drawable.ic_syringe_icon);
                    Log.e(TAG,"Image view is set to syringe");
                } else if (((Reminder_ViewHolder) holder).mediType == 4) {
                    ((Reminder_ViewHolder) 
holder).mediType_view.setBackgroundResource(R.drawable.ic_tablet_icon);
                    Log.e(TAG,"Image view is set to tablet");
                } else {
                    Log.e(TAG,"Image view is set to nothing");
                }

                // Medicine Type code Ended Up here.


                boolean isExpanded = arrayList.get(position).isExpanded();
                ((Reminder_ViewHolder) holder).expandableLayout.setVisibility(isExpanded ? 
View.VISIBLE : View.GONE);
                break;
        }
    }
}

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

public static class Home_ViewHolder extends RecyclerView.ViewHolder {
    public Home_ViewHolder(@NonNull View itemView) {
        super(itemView);
    }
}

public static class Reminder_ViewHolder extends RecyclerView.ViewHolder {

    TextView title,time,date,set_doasge;
    Button cancel_alarm,update_alarm;
    ImageView mediType_view;
    int mediType;
    ArrayList<Model> arrayList;
    database database;
    ConstraintLayout expandableLayout;

    public Reminder_ViewHolder(@NonNull View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.alarm_title);
        time = itemView.findViewById(R.id.alarm_time);
        date = itemView.findViewById(R.id.alarm_date);
        set_doasge = itemView.findViewById(R.id.set_dosage);
        update_alarm = itemView.findViewById(R.id.update_button);
        cancel_alarm = itemView.findViewById(R.id.cancel_button);
        expandableLayout = itemView.findViewById(R.id.expandableLayout);
        mediType_view = itemView.findViewById(R.id.mediType_view);
        Context context = itemView.getContext();
        arrayList = new ArrayList<>();


        title.setonClickListener(v -> {
            Model model = arrayList.get(getAdapterPosition());
            model.setExpanded(!model.isExpanded());
        });

        cancel_alarm.setonClickListener(v -> {


            String text = title.getText().toString();
            Cursor cursor = database.getAllItems(text);

            String title = null,date = null,time = null;
            int requestCode = -1,dosage = -1;
            mediType = -1;

            while (cursor.movetoNext()) {
                title = cursor.getString(0);
                time = cursor.getString(1);
                date = cursor.getString(2);
                dosage = cursor.getInt(3);
                requestCode = cursor.getInt(4);
                mediType = cursor.getInt(5);

            }
            if (title != null && time != null && date != null && dosage != -1 && requestCode != -1) {


                Intent intent = new Intent(context,Deletion_of_Alarm.class);


                intent.putExtra("title",title);
                intent.putExtra("date",date);
                intent.putExtra("time",time);
                intent.putExtra("dosage",dosage);
                intent.putExtra("requestCode",requestCode);

                Log.e(TAG,"title is " + title);
                Log.e(TAG,"date is " + date);
                Log.e(TAG,"time is " + time);
                Log.e(TAG,"dosage  is " + dosage);
                Log.e(TAG,"requestCode is " + requestCode);
                context.startActivity(intent);
            } else if (title == null && time == null && date == null && dosage == -1 && requestCode 
== -1) {
                CustomToast.warningToast(context,"Alarm doesn't exits anymore. Swipe down to 
refresh");
               }
           });
       }
   }
}

这是模型类

public class Model {


public static final int HOME_FRAGMENT = 0;
public static final int REMINDER_FRAGMENT = 1;
String name,date;
int dose,ViewType;

int mediType;
private boolean expanded;

public Model(int ViewType,String name,String time,String date,int message,int mediType) {
    this.name = name;
    this.time = time;
    this.date = date;
    this.dose = message;
    this.mediType = mediType;
    this.ViewType = ViewType;
    this.expanded = false;
}

public int getMediType() {
    return mediType;
}

public void setMediType(int mediType) {
    this.mediType = mediType;
}


public boolean isExpanded() {
    return expanded;
}

public void setExpanded(boolean expanded) {
    this.expanded = expanded;
}


public int getDose() {
    return dose;
}

public void setDose(int dose) {
    this.dose = dose;
}


public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public Model() {
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


String service_name,service_amount,service_date;

public Model(int ViewType,String service_name,String service_amount,String service_date) {
    this.service_name = service_name;
    this.service_amount = service_amount;
    this.service_date = service_date;
    this.ViewType = ViewType;
}
}

现在我主要活动中的一部分代码是:

arrayList = db.ViewData();
    recyclerView.setLayoutManager(new linearlayoutmanager(getActivity()));
    recyclerView.setHasFixedSize(true);
    recyclerAdapter = new com.example.caretaker.RecyclerView.Adapter(arrayList,getActivity());
    recyclerView.setAdapter(recyclerAdapter);
    recyclerAdapter.notifyDataSetChanged();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)