首页 > 解决方案 > 如何从适配器类(不扩展 AppCompatActivity)调用 getSupportFragmentManager()?

问题描述

如果您单击我的 ListView 中的 Name TextView,我想制作一个弹出对话框。

所以我一直在关注这个 youtube 教程:https ://www.youtube.com/watch?v=ARezg1D9Zd0&t= 511s,他会从他的 MainActivity 中弹出一个对话框。但我想从我的 ListView 中弹出它,所以从我的适配器中弹出它。

因此,我无法调用getSupportFragmentManager()。我认为这是因为我的适配器确实扩展了 ArrayAdapter<> 而不是 AppCompatActivity。谁能帮我?

当我说:changeNameDialog.show(getSupportFragmetnManager(), "Change Name 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;
    }
}

标签: javaandroidandroid-studiodialogappcompatactivity

解决方案


使用类中的方法创建接口,Adapter如下所示:

public interface OnAdapterInteractionListener {

    void showDialog();
}

更改您的类的构造函数并在其中Adapter接收您的Activity/ 。将其保存为类中的全局变量。从or调用此构造函数时,传递for 。FragmentOnAdapterInteractionListenerAdapterActivityFragmentthisOnAdapterInteractionListener

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();
        }
    });

希望它能达到你的目的!


推荐阅读