Значения редактирования текста из представления Recycler должны быть обновлены в базе данных Firebase - PullRequest
0 голосов
/ 19 мая 2019

Я могу получить доступ к оценкам, но хочу хранить их только в соответствующих местах (это означает, что каждый ученик получает свои оценки, а не чьи-либо)

Так выглядит мой просмотр в Recycler

Структура данных Firebase

Я дошел до того, что данные собираются из одного редактируемого текста, но не могу добраться до нужного узла Student,

Внутри метода onBindViewHolder

myViewHolder.btnUpdateMarks.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final View v = view;

                Result r = new Result();
                r.setMarks_scored(myViewHolder.etEnterMarks.getText().toString());

                String text = myViewHolder.etEnterMarks.getText().toString();

                myViewHolder.updateValue(text,r,v);
            }
        }); 

Функция UpdateValue

public void updateValue(String text, Result r, final View v){

            final View view = v;
            final Result result = r;

            FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
            final DatabaseReference marksRef = firebaseDatabase.getReference().child("Batches").child("BATCH1");

            marksRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot demo : dataSnapshot.getChildren()){
                        marksRef.child("Results").child("-LfB2Jz7vrbv0vMyYA02").setValue(result);
                    }
                }

Жестко запрограммирован marksRef, что не должно быть так ... Я не могу найти никакого возможного путичтобы получить эти дочерние переменные внутри класса адаптера

Любой, у кого есть более сильное желание решить проблему, пожалуйста, помогите!Извините за плохое общение, пожалуйста, укажите, если чего-то не хватает

----- РЕДАКТИРОВАТЬ --------- Я решил проблему, используя строковый массив внутри моего класса активности и передав его вконструктор моего RecyclerViewAdapter. Проблема в том, что когда я что-то набираю в тексте редактирования 2-го или 3-го элемента, после нажатия кнопки обновления курсор автоматически переходит к тексту редактирования первого элемента. Это мой класс адаптера

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

    Context context;
    ArrayList<Result> resultArrayList;
    String[] firebaseChildValues = new String[2];
    String student_uid;


    public MarksListAdapter(Context c, ArrayList<Result> p, String[] child) {
        context = c;
        resultArrayList = p;
        firebaseChildValues = child;
    }

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

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {
        myViewHolder.tvStudentName.setText(resultArrayList.get(i).getName());
        myViewHolder.tvOutOf_List.setText(" / " + resultArrayList.get(i).getTotal_marks());
        myViewHolder.etEnterMarks.setText(resultArrayList.get(i).getMarks_scored());
        myViewHolder.tvStudentUid.setText(resultArrayList.get(i).getStudent_uid());

        myViewHolder.btnUpdateMarks.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final View v = view;

                student_uid = myViewHolder.tvStudentUid.getText().toString();
                Result r = new Result();
                r.setMarks_scored(myViewHolder.etEnterMarks.getText().toString());

                String text = myViewHolder.etEnterMarks.getText().toString();

                myViewHolder.updateValue(text, r, v, firebaseChildValues, student_uid);
            }
        });


    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView tvStudentName, tvOutOf_List, tvStudentUid;
        EditText etEnterMarks;
        Button btnUpdateMarks;

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

            tvStudentName = (TextView) itemView.findViewById(R.id.tvStudentName);
            etEnterMarks = (EditText) itemView.findViewById(R.id.etEnterMarks);
            tvOutOf_List = (TextView) itemView.findViewById(R.id.tvOutOf_List);
            tvStudentUid = (TextView) itemView.findViewById(R.id.tvStudentUid);
            btnUpdateMarks = (Button) itemView.findViewById(R.id.btnUpdateMarks);
        }

        public void updateValue(String text, Result r, final View v, String[] child, String suid) {

            final View view = v;
            final Result result = r;
            String[] firebaseChildValues = child;
            String resultValue = text;
            String studentUid = suid;

            FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
            final DatabaseReference marksRef = firebaseDatabase.getReference().child("Batches").child(firebaseChildValues[0]).child(studentUid).child("Results").child(firebaseChildValues[1]);

            marksRef.child("marks_scored").setValue(resultValue).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d("TAG_MARKS", marksRef.toString());
                    }
                }
            });
        }
    }
}

1 Ответ

0 голосов
/ 20 мая 2019

Удалить btnUpdateMarks.setOnClickListener из onBindViewHolder

  @Override
    public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {
        myViewHolder.tvStudentName.setText(resultArrayList.get(i).getName());
        myViewHolder.tvOutOf_List.setText(" / " + resultArrayList.get(i).getTotal_marks());
        myViewHolder.etEnterMarks.setText(resultArrayList.get(i).getMarks_scored());
        myViewHolder.tvStudentUid.setText(resultArrayList.get(i).getStudent_uid());
    }

В MyViewHolder Набор классов btnUpdateMarks.setOnClickListener

public MyViewHolder(@NonNull View itemView) {
            super(itemView);
        tvStudentName = (TextView) itemView.findViewById(R.id.tvStudentName);
        etEnterMarks = (EditText) itemView.findViewById(R.id.etEnterMarks);
        tvOutOf_List = (TextView) itemView.findViewById(R.id.tvOutOf_List);
        tvStudentUid = (TextView) itemView.findViewById(R.id.tvStudentUid);
        btnUpdateMarks = (Button) itemView.findViewById(R.id.btnUpdateMarks);


        btnUpdateMarks.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                student_uid = tvStudentUid.getText().toString();
                String text = etEnterMarks.getText().toString();
                Result r = new Result();
                r.setMarks_scored(text);

                int itemClickedPosition = getLayoutPosition();

                //updateValue(text, r, v, firebaseChildValues, student_uid);
                //change your updateValue() method accordingly
            }
        });


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...