Как вызвать getSupportFragmentManager () из класса адаптера (который не расширяет AppCompatActivity)? - PullRequest
0 голосов
/ 26 марта 2020

Я хочу создать диалоговое окно, которое появляется, если вы щелкнете по TextView имени в моем ListView.

Итак, я следую этому руководству YouTube: https://www.youtube.com/watch?v=ARezg1D9Zd0&t=511s и он делает диалог, который всплывает из его MainActivity. Но я хочу получить его из моего ListView, а также из моего адаптера.

Из-за этого я не могу вызвать getSupportFragmentManager () . Я думаю, это потому, что мой адаптер расширяет ArrayAdapter <> вместо AppCompatActivity. Кто-нибудь может мне помочь?

Когда я говорю: changeNameDialog.show (getSupportFragmetnManager (), "Dialog Change Dialog"), происходит ошибка;

public class PlayersAdapter extends ArrayAdapter<Player> {
    Tournament tournament = new Tournament();

    private LayoutInflater Inflater;

    public PlayersAdapter(@NonNull Context context, @NonNull List<Player> objects) {
        super(context, R.layout.list_players,objects);

        Inflater = LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if (convertView == null) {
            convertView = Inflater.inflate(R.layout.list_players, parent, false);
        }

        ImageView profilePictureButtonImageView = convertView.findViewById(R.id.profilePictureButtonImageView);
        TextView namePlayerTextView = convertView.findViewById(R.id.namePlayerTextView);
        TextView pointsTextView = convertView.findViewById(R.id.pointsTextView);
        ImageView deleteButtonImageView = convertView.findViewById(R.id.deleteButtonImageView);

        Player player = getItem(position);

        profilePictureButtonImageView.setImageResource(player.getProfilePicture());
        namePlayerTextView.setText(player.getName());
        pointsTextView.setText(tournament.getPlayers().get(position).getTotalPoints() + "");

        // Change name
        namePlayerTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ChangeNameDialog changeNameDialog = new ChangeNameDialog();
                changeNameDialog.show(getSupportFragmetnManager(), "Change Name Dialog");
            }
        });

        return convertView;
    }
}

1 Ответ

0 голосов
/ 26 марта 2020

Создайте интерфейс с методом в вашем Adapter классе следующим образом:

public interface OnAdapterInteractionListener {

    void showDialog();
}

Измените конструктор вашего Adapter класса и получите Activity / Fragment как OnAdapterInteractionListener в этом. Сохраните его как глобальную переменную в вашем классе Adapter. При вызове этого конструктора из вашего Activity или Fragment, передайте this для OnAdapterInteractionListener.

private LayoutInflater Inflater;
private OnAdapterInteractionListener mListener;

public PlayersAdapter(@NonNull Context context, @NonNull List<Player> objects, OnAdapterInteractionListener listener) {
    super(context, R.layout.list_players,objects);

    Inflater = LayoutInflater.from(context);
    mListener = listener;
}

Заставьте Activity / Fragment реализовать интерфейс адаптера OnAdapterInteractionListener и Реализуйте его метод следующим образом:

@Override
public void showDialog() {
    ChangeNameDialog changeNameDialog = new ChangeNameDialog();
    changeNameDialog.show(getSupportFragmentManager(), "Change Name Dialog");
}

Наконец, в вашем Adapter измените ваш onClick() метод следующим образом:

namePlayerTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mListener != null) mListener.showDialog();
        }
    });

Надеюсь, он служит вашей цели!

...