CustomDialog не может быть приведен внутри Адаптера из фрагмента - PullRequest
0 голосов
/ 10 июня 2019

У меня есть адаптер для RecyclerView из фрагмента.Я хочу открыть CustomDialog из этого адаптера и передать ему некоторую информацию, чтобы я создал интерфейс, но я получаю эту ошибку:

 java.lang.ClassCastException: com.ainkiwi.taskme.Fragments.UserTasksPublishedFragment cannot be cast to com.ainkiwi.taskme.FeedbackDialog$FeedbackDialogListener

Класс адаптера:

public class CurrentUserTaskListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements FeedbackDialog.FeedbackDialogListener {
  private Fragment mFragment;
  public CurrentUserTaskListAdapter(Fragment mFragment, ....){
  this.mFragment = mFragment;
  }
  ...
  public void onClick(View v)
  showDialogFeedBack();
  ...
    private void showDialogFeedBack() {

    FeedbackDialog feedbackDialog = new FeedbackDialog();
    feedbackDialog.setTargetFragment(mFragment, 1);
    feedbackDialog.show(mFragment.getFragmentManager(), "FeedbackDialog");
    }

    @Override
    public void applyRatings(float skill, float timing, float chat) {
        //TODO firestore method that adds this to database
        this.skill = skill;
        this.timing = timing;
        this.chat = chat;
        Log.d("listenerCheck", "test");
    }

Класс CustomDialog:

public class FeedbackDialog extends AppCompatDialogFragment {
private RatingBar ratingBarSkills, ratingBarTiming, ratingBarChat;
private FeedbackDialogListener listener;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.layout_dialog_feedback, null);

    builder.setView(view)
            .setNegativeButton("Skip", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            })
            .setPositiveButton("Done", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    float skill = ratingBarSkills.getRating();
                    float timing = ratingBarTiming.getRating();
                    float chat = ratingBarChat.getRating();

                    listener.applyRatings(skill, timing, chat);
                }
            });
    ratingBarSkills = view.findViewById(R.id.rbSkill);
    ratingBarTiming = view.findViewById(R.id.rbTiming);
    ratingBarChat = view.findViewById(R.id.rbChat);

    return builder.create();
}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    listener = (FeedbackDialogListener) getTargetFragment();
}

public interface FeedbackDialogListener {
    void applyRatings(float skill, float timing, float chat);
    }
}

Как мне пройти эту ошибку?Я пытался с getTargetFragment () и setTargetFragment (mFragment, 1); , как я видел на многих страницах, но пока никаких результатов

Ответы [ 3 ]

2 голосов
/ 10 июня 2019

Проблема здесь:

   listener = (FeedbackDialogListener) getTargetFragment();

mFragment is UserTasksPublishedFragment

, а UserTasksPublishedFragment не реализует FeedbackDialogListener, поэтому вы получили ClassCastException.

Добавлено:

Вы удаляете это из своего адаптера:

@Override
    public void applyRatings(float skill, float timing, float chat) {
        //TODO firestore method that adds this to database
        this.skill = skill;
        this.timing = timing;
        this.chat = chat;
        Log.d("listenerCheck", "test");
    }

и добавляете его в UserTasksPublishedFragment (после реализации FeedbackDialogListener).

Как только он появится, вы можете установить свои значения для адаптера (который должен быть полем)

0 голосов
/ 10 июня 2019

Вы должны наследовать свой класс UserTasksPublishedFragment от FeedbackDialogListener. И переопределить методы, которые необходимы.

public class UserTasksPublishedFragment extends Fragment implements AvailableTaskListAdapter.OnAvailableTaskListener, CurrentUserTaskListAdapter.OnMyTaskPublishedListener, CurrentUserTaskListAdapter.OnMyTaskAssignedListener, CurrentUserTaskListAdapter.OnOtherTaskAssignedToMeListener,
FeedbackDialog.FeedbackDialogListener {

@Override
void applyRatings(float skill, float timing, float chat){

}
...
0 голосов
/ 10 июня 2019

UserTasksPublishedFragment (полный):

public class UserTasksPublishedFragment extends Fragment implements AvailableTaskListAdapter.OnAvailableTaskListener, CurrentUserTaskListAdapter.OnMyTaskPublishedListener, CurrentUserTaskListAdapter.OnMyTaskAssignedListener, CurrentUserTaskListAdapter.OnOtherTaskAssignedToMeListener {

    private static final String TAG = "UserTasksList";
    private FirebaseFirestore mFirestore;
    private RadioGroup radioGroup;
    private RadioButton checkedRadioButton;
    private RecyclerView rvAvailableTasks;
    private AvailableTaskListAdapter availableTaskListAdapter;
    private CurrentUserTaskListAdapter currentUserTaskListAdapter;
    private List<Task> tasksList, currentUserTasksList;
    private List<String> idTaskList, idCurrentUserTaskList;
    private int numberOfTasksAssignedToCurUser;
    private String currentLoggedUser;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_user_tasks_list, container, false);
        radioGroup = (RadioGroup) view.findViewById(R.id.radioGroup);
        checkedRadioButton = (RadioButton) radioGroup.findViewById(radioGroup.getCheckedRadioButtonId());
        setHasOptionsMenu(true);

        mFirestore = FirebaseFirestore.getInstance();
        currentLoggedUser = SaveSharedPreference.getEmail(getActivity().getApplicationContext());

        idTaskList = new ArrayList<>();
        tasksList = new ArrayList<>();
        currentUserTasksList = new ArrayList<>();
        idCurrentUserTaskList = new ArrayList<>();
        currentUserTaskListAdapter = new CurrentUserTaskListAdapter(currentUserTasksList, idCurrentUserTaskList, getActivity(), getContext(), this, this, this, mFirestore, this);

        rvAvailableTasks = (RecyclerView) view.findViewById(R.id.rvTasks);
        rvAvailableTasks.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.VERTICAL));
        rvAvailableTasks.setHasFixedSize(true);
        rvAvailableTasks.setLayoutManager(new LinearLayoutManager(getActivity()));

        populateTasksAvailableList();


        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // This puts the value (true/false) into the variable
                boolean isChecked = checkedRadioButton.isChecked();
                // If the radiobutton that has changed in check state is now checked...
                if (isChecked) {
                    rvAvailableTasks.setAdapter(availableTaskListAdapter);
                    availableTaskListAdapter.notifyDataSetChanged();
                } else {
                    rvAvailableTasks.setAdapter(currentUserTaskListAdapter);
                    currentUserTaskListAdapter.notifyDataSetChanged();
                }
            }
        });

        return view;
    }

    private void populateTasksAvailableList() {
        numberOfTasksAssignedToCurUser = 0;
        Log.d(TAG, "Save shared user name: " + SaveSharedPreference.getEmail(getActivity().getApplicationContext()));
        mFirestore.collection("listedTasks").addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@javax.annotation.Nullable QuerySnapshot documentSnapshots, @javax.annotation.Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.d(TAG, "Error: " + e.getMessage());
                    return;
                }
                for (DocumentSnapshot doc : documentSnapshots) {
                    Task task = doc.toObject(Task.class);

                    if (!task.getUser().equals(currentLoggedUser) && task.getAssignedTo().equals(currentLoggedUser))
                        numberOfTasksAssignedToCurUser++;

                    if (task.getUser().equals(currentLoggedUser) || task.getAssignedTo().equals(currentLoggedUser)) {
                        currentUserTasksList.add(task);
                        idCurrentUserTaskList.add(doc.getId());

                    } else {
                        if (!isTaskExpired(task) && task.getAssignedTo().isEmpty()) {
                            tasksList.add(task);
                            idTaskList.add(doc.getId());
                        }
                    }
                }
                sortTaskListChronological(currentUserTasksList);

                availableTaskListAdapter = new AvailableTaskListAdapter(tasksList, idTaskList, getActivity(), mFirestore, UserTasksPublishedFragment.this, numberOfTasksAssignedToCurUser, UserTasksPublishedFragment.this);
                availableTaskListAdapter.notifyDataSetChanged();
                currentUserTaskListAdapter = new CurrentUserTaskListAdapter(currentUserTasksList, idCurrentUserTaskList, getActivity(), getContext(), UserTasksPublishedFragment.this, UserTasksPublishedFragment.this, UserTasksPublishedFragment.this, mFirestore, UserTasksPublishedFragment.this);

                rvAvailableTasks.setAdapter(availableTaskListAdapter);
                Log.d(TAG, "numberOfTasksAssignedToCurUser " + numberOfTasksAssignedToCurUser);
            }
        });
        Log.d(TAG, "numberOfTasksAssignedToCurUser " + numberOfTasksAssignedToCurUser);
    }

    private boolean isTaskExpired(Task task) {
        Calendar curentTime = new java.util.GregorianCalendar();
        Calendar taskTime = new java.util.GregorianCalendar();
        taskTime.setTime(task.getStartDateTime());

        return curentTime.after(taskTime);
    }

    private void sortTaskListChronological(List<Task> mList) {
        if (mList.size() > 1)
            Collections.sort(mList, new Comparator<Task>() {
                @Override
                public int compare(Task o1, Task o2) {
                    return o1.getStartDateTime().compareTo(o2.getStartDateTime());
                }
            });
    }


    @Override
    public void onTaskClicked(int position) {

    }

    @Override
    public void onMyTaskAssignedClicked(int position) {

    }

    @Override
    public void onMyTaskPublishedClicked(int position) {

    }


    @Override
    public void onOtherTaskAssignedToMeClicked(int position) {

    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.search_bar, menu);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
        searchView.setQueryHint("Cauta locatii");

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                availableTaskListAdapter.getFilter().filter(newText);
                return false;
            }
        });

        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public void onDestroyOptionsMenu() {
        setHasOptionsMenu(false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...