Обновление элементов списка в фрагменте из каталога внутри другого фрагмента - PullRequest
1 голос
/ 29 января 2020

Название может быть немного запутанным, поэтому я надеюсь, что смогу express правильно решить мою проблему. Поэтому я работаю над простым приложением журнала тренировок. У меня есть фрагмент ActiveWorkout, как на рисунке 1. Когда я нажимаю розовую кнопку добавления, меня направляют к другому фрагменту, который содержит различные упражнения в виде списка, который показан на рисунке 2. Затем я должен выбрать упражнение (с помощью onItemClickListener) и заголовок этого упражнения должен быть отправлен обратно в ActiveWorkoutFragment и добавлен в активную тренировку, поэтому он должен быть похож на изображение 3. Итак, проблема в том, что я не знаю точно, как сохранить мою активную тренировку «живой», оно должно быть обновлено, если я хочу добавить другое упражнение, и не быть пустым, когда я снова нажимаю розовую кнопку добавления, поэтому в конце это должно быть примерно так, как показано на рисунке 4. Я думал об отправке данных с помощью пакета, который я также пробовал в коде, но более трудной частью является обновление списка тренировок без удаления предыдущих добавленных упражнений. Кстати, причина, по которой я пытаюсь сделать что-то подобное, заключается в том, что данные на самом деле находятся в базе данных Firebase, поэтому в некотором смысле я пытаюсь получить данные из базы данных Workout.

Изображения:

Изображение 1 Изображение 2 Изображение 3 Изображение 4

Это список упражнений или каталог:

public class ExercisesFragment extends Fragment {

    private ListView lv;
    private FirebaseListAdapter adapter;
    private ArrayList<Exercise> exerciseList;
    private ArrayList<String> nameList;
    //private Adapter adapter;

    public ExercisesFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_exercises, container, false);
        lv = v.findViewById(R.id.lv);
        Query query = FirebaseDatabase.getInstance().getReference().child("exerciseList");
        FirebaseListOptions<ExerciseElement> options = new FirebaseListOptions.Builder<ExerciseElement>()
                .setLayout(R.layout.exercise)
                .setQuery(query, ExerciseElement.class)
                .build();

        adapter = new FirebaseListAdapter(options) {
            @Override
            protected void populateView(@NonNull View v, @NonNull Object model, int position) {
                TextView bodypart = v.findViewById(R.id.bodypart);
                TextView title = v.findViewById(R.id.title);

                ExerciseElement el = (ExerciseElement) model;
                bodypart.setText(el.getBodypart().toString());
                title.setText(el.getTitle().toString());


            }
        };
        lv.setAdapter(adapter);


        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ExerciseElement el = (ExerciseElement) lv.getItemAtPosition(position);
                String item = el.getTitle();

                ActiveWorkoutFragment awf = new ActiveWorkoutFragment();
                Bundle args = new Bundle();
                args.putString("ExerciseTitle", item);
                awf.setArguments(args);

                getFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, awf).commit();
                //Navigation.findNavController(v).navigate(R.id.activeWorkoutFragment);

            }
        });
        return v;
    }

    @Override
    public void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

Затем есть фрагмент ActiveWorkoutFragment, который немного длиннее, но верхняя часть не имеет значения. Метод addNewExercise () вызывается, когда я нажимаю на розовую кнопку добавления, поэтому я пытался как-то там получить данные.

public class ActiveWorkoutFragment extends Fragment {

    private Workout workout;
    private TextView emptyRecyclerView;
    private RecyclerView exerciseRecyclerView;
    private ExerciseRecyclerViewAdapter adapter;
    private WorkoutHistory workoutHistory;
    private FloatingActionButton fab;
    private FirebaseAuth mAuth;
    private DatabaseReference databaseWorkouts;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {



        View v =  inflater.inflate(R.layout.fragment_active_workout, container, false);
        fab = v.findViewById(R.id.fab);
        fab.setOnClickListener(this::addNewExercise);
        setHasOptionsMenu(true);

        workout = new Workout("WORKOUT");

        if(savedInstanceState != null) {
            workout = savedInstanceState.getParcelable("key");
        }

        emptyRecyclerView = v.findViewById(R.id.empty_recycler_view);
        //buildRecyclerView(workout);
        exerciseRecyclerView = v.findViewById(R.id.recycler_view_exercise);

        // improves performance if size of RecyclerView content is fixed
        // taken from developer.android.com
        exerciseRecyclerView.setHasFixedSize(true);

        // use a linear layout manager for RecyclerView
        LinearLayoutManager layoutManager = new LinearLayoutManager(this.getContext());
        exerciseRecyclerView.setLayoutManager(layoutManager);

        // add divider
        RecyclerView.ItemDecoration itemDecoration = new
                DividerItemDecoration(this.getContext(), DividerItemDecoration.VERTICAL);
        exerciseRecyclerView.addItemDecoration(itemDecoration);

        // Create adapter and set its data set to workout
        adapter = new ExerciseRecyclerViewAdapter(workout, this);

        // Set up swipe to dismiss and ability to move RecyclerView items around

        // Create callback object for ItemTouchHelper
        ItemTouchHelper.Callback callback = new CustomItemTouchHelperCallback(adapter);

        // Implement object created above
        ItemTouchHelper touchHelper = new ItemTouchHelper(callback);

        touchHelper.attachToRecyclerView(exerciseRecyclerView);

        if (adapter.getItemCount() == 0)
        {
            showEmptyRecyclerViewText();
        }
        else
        {
            exerciseRecyclerView.setAdapter(adapter);
        }

        return v;
    }

    // Adds save button (check mark) to action bar
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.active_workout_action_bar, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_save: {

                List<Exercise> exercises = workout.getExercises();

                mAuth = FirebaseAuth.getInstance();
                String user_id = mAuth.getCurrentUser().getUid();


                databaseWorkouts = FirebaseDatabase.getInstance().getReference("Workouts").child(user_id);
                String id = databaseWorkouts.push().getKey();

                workout = new Workout("abc", user_id, exercises);
                databaseWorkouts.child(id).setValue(workout);


                Toast.makeText(getContext(), "Workout saved", Toast.LENGTH_SHORT).show();

                return true;
            }
            case R.id.action_delete: {
                exerciseRecyclerView.requestFocus();

                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                builder.setTitle("Confirm deletion").setMessage("Are you sure you want to delete" +
                        " this workout?");

                builder.setPositiveButton(android.R.string.yes, (dialog, which) -> {
                    try {
                        workoutHistory.removeWorkout(workout);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    Toast.makeText(getContext(), "Workout deleted", Toast.LENGTH_SHORT).show();
                });
                builder.setNegativeButton(android.R.string.no, (dialog, which) -> {
                    dialog.dismiss();
                });

                builder.show();
                return true;
            }
            default:
                // unrecognized button pressed
                return super.onOptionsItemSelected(item);
        }
    }

    public void showEmptyRecyclerViewText()
    {
        emptyRecyclerView.setVisibility(View.VISIBLE);
    }

    public void addNewExercise(View view) {

        Bundle bundle = getArguments();
        String value = "";
        if(bundle != null) {
            value = bundle.getString("ExerciseTitle");
        }
        System.out.println("lala");
        System.out.println(value);

        Exercise newExercise = new Exercise(value, -1, -1);
        if (exerciseRecyclerView.getAdapter() == null) {
            exerciseRecyclerView.setAdapter(adapter);
        }


        emptyRecyclerView.setVisibility(View.INVISIBLE);

        workout.addExercise(newExercise);

        adapter.notifyItemInserted(workout.getExercises().size() - 1);
    }

    private void hideKeyboard(Context context, View view) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService
                (Activity.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("key", workout);
    }
}

1 Ответ

0 голосов
/ 29 января 2020

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

//contract to update Framgents
public interface FragUpdater {
    public void updateExerciseFrag(Exercise exercise);
}



public class ExerciseActiity extends AppCompatActivity implements FragUpdater {
    FragmentManager fm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exercise_actiity);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                gotoActiveWorkoutFragment();
            }
        });
        fm = getSupportFragmentManager();

        gotoExercisesFragment();
    }

    private void gotoActiveWorkoutFragment() {
        ActiveWorkoutFragment activeWorkoutFragment = new ActiveWorkoutFragment();
        Bundle bundle = new Bundle();
        activeWorkoutFragment.setArguments(bundle);
        fm.beginTransaction().add(R.id.content_frame, activeWorkoutFragment, "ExerciseSelectionFrag").addToBackStack(null).commit();
    }

    private void gotoExercisesFragment() {
        ExercisesFragment exercisesFragment = new ExercisesFragment();
        Bundle bundle = new Bundle();
        exercisesFragment.setArguments(bundle);
        fm.beginTransaction().replace(R.id.content_frame, exercisesFragment, "ExerciseDisplayFrag").commit();
    }

    @Override
    public void updateExerciseFrag(Exercise exercise) {
        // Get Fragment ExercisesFragment
        ExercisesFragment frag = (ExercisesFragment)
        fm.findFragmentByTag("ExerciseDisplayFrag");
        if (frag == null) {
            return;
        }
        frag.updateList(exercise);
    }


}



public class ExercisesFragment extends Fragment {

    //here update your list in ExerciseFragment
    public void updateList(Exercise exercise) {}
}


public class ActiveWorkoutFragment extends Fragment {
    FragUpdater fragUpdater;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragUpdater = (ExerciseActiity) getActivity();
    }

    private void selectListItem(Exercise exercise) {
        fragUpdater.updateExerciseFrag(exercise);
        getActivity().getSupportFragmentManager().popBackStack();


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