java - 如何从适配器类(不扩展 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;
}
}
解决方案
使用类中的方法创建接口,Adapter
如下所示:
public interface OnAdapterInteractionListener {
void showDialog();
}
更改您的类的构造函数并在其中Adapter
接收您的Activity
/ 。将其保存为类中的全局变量。从or调用此构造函数时,传递for 。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();
}
});
希望它能达到你的目的!
推荐阅读
- python - ax.set_yticklabels 将刻度显示为长小数
- node.js - Returning status code from the node api service
- java - How to transfer all the data from one JFrame to another JFrame through a button?
- android - 如何从存储库返回 LiveData
- angular - 运行 npm install 命令时出错
- azure-devops - Azure DevOps Services 中的多个 wiki 和安全访问
- python - 为什么 Python 中的 set 函数会为相同的输入产生不同的输出?
- macos - Docker,可以用linux和mac组成集群(swarm模式)吗?
- java - 如何在 sping Data JPA 中使用 CriteriaUpdate 执行更新操作?
- javascript - JavaScript - 网络 ip 上的 Raspberry PI 的 XMLHttpRequest 在移动设备上失败,而不是在桌面上