Firebase ArrayList с кнопками обновления данных Firebase - PullRequest
0 голосов
/ 06 января 2019

Я создаю систему управления назначением для студентов и преподавателей. У меня есть массив списка, который извлекает данные из Firebase. Я включил две кнопки, чтобы изменить статус встречи на принятую или отклоненную. Я не смог найти код для обновления данных о базе данных в окне списка при нажатии кнопок.

Я на самом деле новичок в разработке для Android, так что прости меня, если я задаю вопросы, на которые легко ответить. Я перепробовал все, чтобы найти решение своей проблемы, но я не могу найти ни одного. Это система управления назначением, где студенты могут назначить встречу со своими лекторами. Для просмотра лектора у меня есть просмотр списка, который показывает все запросы о встрече, сделанные студентами. В каждом ряду будет 2 набора кнопок, предназначенных для принятия или отклонения встречи. Когда нажата одна из кнопок, она обновит статус встречи, например; нажмите кнопку подтверждения, чтобы подтвердить статус. Данные извлекаются из базы данных Firebase в реальном времени. Моя проблема в том, что я не смог найти подходящий код для обновления статуса встречи, когда нажата любая из двух кнопок. Мне действительно нужна помощь для этого. Заранее спасибо.

Это для моей деятельности.

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.lect_fragment_appointment, container, false);

    myrecyclerview= (RecyclerView)  v.findViewById(R.id.appointment_list_recyclerview2);
    myrecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
    list = new ArrayList<ListView_Appointmnet_LectView>();

    SharedPreferences preferences = this.getActivity().getSharedPreferences("user_details", Context.MODE_PRIVATE);

    databaseReference = FirebaseDatabase.getInstance().getReference().child("Appointment");


    Query query1 = databaseReference.orderByChild("lect_name").equalTo(preferences.getString("Lect_Name",null));



    query1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
            {

                ListView_Appointmnet_LectView L = dataSnapshot1.getValue(ListView_Appointmnet_LectView.class);
                list.add(L);

            }

            adapter = new CustomAdapter_ListView_Lecturer(getContext(),list);
            myrecyclerview.setAdapter(adapter);
            adapter.notifyDataSetChanged();

}

Это мой вид адаптера

public class CustomAdapter_ListView_Lecturer extends RecyclerView.Adapter<CustomAdapter_ListView_Lecturer.MyViewHolder> {

Context context;

ArrayList <ListView_Appointmnet_LectView> appointment_lectview ;

public CustomAdapter_ListView_Lecturer(Context c, ArrayList<ListView_Appointmnet_LectView> a)
{
    context = c;
    appointment_lectview = a;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_appointment_list_lecturer, viewGroup, false));
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int position) {

    myViewHolder.name.setText(appointment_lectview.get(position).getStudent_ID());
    myViewHolder.subject.setText(appointment_lectview.get(position).getSubject());
    myViewHolder.date.setText(appointment_lectview.get(position).getStart_date());
    myViewHolder.time.setText(appointment_lectview.get(position).getStart_time());
    myViewHolder.onClick(position);



}

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

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView name, date, subject, time, status;
    ImageButton approve_btn, reject_btn;


    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.appointment_studentID);
        date = (TextView) itemView.findViewById(R.id.appointment_date);
        subject = (TextView) itemView.findViewById(R.id.appointment_subject);
        time = (TextView) itemView.findViewById(R.id.appointment_time);
        status = (TextView) itemView.findViewById(R.id.appointment_status);
        approve_btn = (ImageButton) itemView.findViewById(R.id.approve_btn);
        reject_btn = (ImageButton) itemView.findViewById(R.id.reject_btn);
    }

    public void onClick(final int position) {
        approve_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Approve " + position + "is clicked", Toast.LENGTH_SHORT).show();


            }
        });

        reject_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Reject " + position + "is clicked", Toast.LENGTH_SHORT).show();

            }
        });
    }
}

}

Класс установки и получения:

public class ListView_Appointmnet_LectView {

private String start_date;
private String subject;
private String start_time;
private String student_ID;
private String status;


public ListView_Appointmnet_LectView() {

}

public ListView_Appointmnet_LectView(String start_date, String subject, String start_time, String student_ID, String status) {
    this.start_date = start_date;
    this.subject = subject;
    this.start_time = start_time;
    this.student_ID = student_ID;
    this.status = status;
}

public String getStart_date() {
    return start_date;
}

public void setStart_date(String start_date) {
    this.start_date = start_date;
}

public String getSubject() {
    return subject;
}

public void setSubject(String subject) {
    this.subject = subject;
}

public String getStart_time() {
    return start_time;
}

public void setStart_time(String start_time) {
    this.start_time = start_time;
}

public String getStudent_ID() {
    return student_ID;
}

public void setStudent_ID(String student_ID) {
    this.student_ID = student_ID;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

}

1 Ответ

0 голосов
/ 06 января 2019

Когда пользователь нажимает на элемент в представлении переработчика, вам сообщают позицию / индекс элемента, на который он щелкнул. Поэтому вам нужно каким-то образом сопоставить эту позицию с ключом этого элемента в базе данных реального времени Firebase.

Простой способ сделать это - сохранить значение и ключ снимков. Прямо сейчас ваш код игнорирует ключ, только принимая значение. Таким образом, добавив дополнительный список с ключами, вы сможете найти ключ при нажатии на элемент.

Основной фрагмент кода, который вам нужно изменить, это onDataChange:

query1.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
        {
            ListView_Appointmnet_LectView L = dataSnapshot1.getValue(ListView_Appointmnet_LectView.class);
            list.add(L);

            String key = dataSnapshot1.getKey();
            keyList.add(key);
        }

Чтобы это работало, вам нужно:

  1. Добавьте переменную keyList к onCreateView.
  2. Дайте CustomAdapter_ListView_Lecturer поле участника для хранения списка ключей.
  3. Передайте keyList в конструктор CustomAdapter_ListView_Lecturer и установите поле члена.
  4. Сделайте так, чтобы ваши классы держателей вида могли найти адаптер, либо передав его в конструктор, либо убедившись, что адаптер виден в области видимости держателей.
  5. Найдите ключ нажатого элемента по его позиции:

    public void onClick(final int position) {
        approve_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Approve " + position + "is clicked", Toast.LENGTH_SHORT).show();
                String key = adapter.mKeyList.get(position);
    
  6. Обновить элемент на основе его ключа:

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Appointment");
    ref.child(key).child("status").setValue("NEW STATUS");
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...